トップ回答者
ClickOnce配布によるインストールエラー

質問
-
ClickOnceによるアプリケーション配布を考えております。
以下の環境において、アプリケーションのインストールに失敗してしまうのですが
原因が分からず行き詰まり状態となってしまいました。
なにかお知恵がある方がいましたら、ご教示ください。
■■■ 環境 ■■■
サーバーOS: Windows2008 R2(64bit)
Webサーバー: Apache2.0.54
開発:Visual Studio 2008
.Net Framework 3.5
上記の環境において、アプリケーション構成ファイル(App.config)を含んだモジュールを
配置し、インストールを行おうとすると下記のエラーが発生しインストールが行えません。
===================================================================
プラットフォームのバージョン情報
Windows : 6.1.7601.65536 (Win32NT)
Common Language Runtime : 4.0.30319.18408
System.Deployment.dll : 4.0.30319.18408 built by: FX451RTMGREL
clr.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfdll.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfshim.dll : 4.0.31106.0 (Main.031106-0000)
ソース
配置の URL : http://XXXXX/ClickOnceSample/AB/publish/ApachClickOnceB.application
サーバー : Apache/2.0.54 (Win32) PHP/5.1.4 mod_aspdotnet/2.0
アプリケーションの URL : http://XXXXX/ClickOnceSample/AB/publish/Application%20Files/ApachClickOnceB_1_0_0_0/ApachClickOnceB.exe.manifest
サーバー : Apache/2.0.54 (Win32) PHP/5.1.4 mod_aspdotnet/2.0
ID
配置 ID : ApachClickOnceB.application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=15be10b024df7a0d, processorArchitecture=msil
アプリケーション ID : ApachClickOnceB.exe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=15be10b024df7a0d, processorArchitecture=msil, type=win32
アプリケーションの概要
* インストールできるアプリケーションです。
エラーの概要
以下はエラーの概要です。これらのエラーの詳細はログに一覧表示されています。
* http://XXXXX/ClickOnceSample/AB/publish/ApachClickOnceB.application のライセンス認証により例外が発生しました。 次の失敗メッセージが検出されました:
+ ファイル ApachClickOnceB.exe.config は、マニフェストで指定されているものとは異なる処理されたハッシュを持っています。
コンポーネント ストア トランザクションの失敗の概要
トランザクション エラーは検出されませんでした。
警告
この操作中に警告は発生しませんでした。
操作の進行状況
* [2015/08/19 18:39:23] : http://XXXXX/ClickOnceSample/AB/publish/ApachClickOnceB.application のライセンス認証が開始されました。
* [2015/08/19 18:39:23] : 配置マニフェストの処理は正常に完了しました。
* [2015/08/19 18:39:23] : アプリケーションのインストールが開始されました。
* [2015/08/19 18:39:23] : アプリケーション マニフェストの処理は正常に完了しました。
* [2015/08/19 18:39:25] : 互換性のあるランタイム バージョン 2.0.50727 が見つかりました。
* [2015/08/19 18:39:25] : Sentinel.v3.5Client, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=msil を使用している依存アセンブリ Sentinel.v3.5Client, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=msil を検出しています。
* [2015/08/19 18:39:25] : System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=msil を使用している依存アセンブリ System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=msil を検出しています。
* [2015/08/19 18:39:25] : WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=msil を使用している依存アセンブリ WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=msil を検出しています。
* [2015/08/19 18:39:25] : System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=msil を使用している依存アセンブリ System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=msil を検出しています。
* [2015/08/19 18:39:25] : 信頼の要求とプラットフォームの検出が完了しました。
エラーの詳細
この操作中に次のエラーが検出されました。
* [2015/08/19 18:39:26] System.Deployment.Application.InvalidDeploymentException (HashValidation)
- ファイル ApachClickOnceB.exe.config は、マニフェストで指定されているものとは異なる処理されたハッシュを持っています。
- ソース:System.Deployment
- スタック トレース:
場所 System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, Hash hash)
場所 System.Deployment.Application.ComponentVerifier.VerifyFileHash(String filePath, HashCollection hashCollection)
場所 System.Deployment.Application.ComponentVerifier.VerifyComponents()
場所 System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
場所 System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
場所 System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
場所 System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
場所 System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)
コンポーネント ストア トランザクションの詳細
トランザクション情報はありません。
===================================================================
なお、上記の環境でアプリケーション構成ファイルを含まないモジュールでは成功、また
アプリケーション構成ファイルを含んでいても、WebサーバーをIISに変えた場合は
正常にインストールが行えることまでは確認しております。
フォーラム違い(Apacheが原因?)かもしれませんが、なにとぞよろしくお願いいたします。- 移動 星 睦美 2015年8月20日 0:31 Visual C# から
回答
-
>しかも.configにハッシュ値ってそもそも持ってるの?という感じです。
例えば以下を読んでいただくと理解できると思いますが、app.configは事前にハッシュ値が計算されてマニフェストに保持されており、ダウンロードされてきた際にそのハッシュ値と比較し、改ざんを防止しています。
[ClickOnce Tips] アプリケーションの発行後に、アプリケーション設定ファイルの内容を編集するには
http://blogs.msdn.com/b/jpvsblog/archive/2011/05/26/clickonce-tips.aspxですから、サーバーにアップされた時か、クライアントにダウンロードされた時かでapp.configが変わってしまっているんじゃないかと思ったのです。よって、先の質問でエンコードが何か等を質問させていただきました。
とりあえず、サーバーにアップした際と、ダウンロードした際に、元のapp.configと変わっていないかを確かめて見られると良いかもしれません。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 渡邊 一間 2015年8月20日 5:50
-
たとえば、サーバーへの配置に FTP を用いていて、その時に ASCII モード転送による改行コード変換が入ってしまっていた…という可能性は無いでしょうか。
試しに、appName.exe.config.deploy の改行コードを変更してみたところ、今回のエラーを再現できました。
しかも.configにハッシュ値ってそもそも持ってるの?という感じです。
appName.exe.manifest ファイル内に、appName.exe や appName.exe.config に対応した <hash> タグがあります。
- 編集済み 魔界の仮面弁士MVP 2015年8月20日 4:30
- 回答としてマーク 渡邊 一間 2015年8月20日 5:51
-
内容からするとアプリケーション発行後に、手で発行先のapp.configを編集するとハッシュ値(及びサイズも)かわってしまい、マニフェストの記述と相違が発生してしまい、検証エラーが出ると認識しております。こちらについては認識正しいでしょうか?
その認識で良いと思います。よって、ClickOnceを発行する前にapp.configの編集しておくと良いという例が以下にあります。
ClickOnce配置資材でWebサービスを利用する場合
http://vsug.jp/tabid/63/forumid/42/postid/2666/view/topic/Default.aspxちなみに、ファイルが見つからないと違うエラーが出ると思っていました。最初は何かブロックされているのかもしれないと思っていたのですが、思い込みは危険だということですね。失礼いたしました。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 渡邊 一間 2015年8月20日 8:50
すべての返信
-
IISでうまくいくのでしたら、Apacheの問題だと思います。確認ですが、以下のようにMIMEタイプは設定されているのでしょうか?
ClickOnce on Apache
http://software.clempaul.me.uk/articles/clickonce/★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-
そうでした。失礼いたしました。すみません。
とすると、app.configのエンコーディングの問題かもしれません。app.configの1行目辺りにエンコーディングの指定があると思いますが、そこはどうなっていますでしょうか?
(追記)
あと一応ですが、MIMEタイプに以下が無い場合は、追加されると良いかもしれません。.config application/octet-stream
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年8月20日 1:45 追記
-
>trapemiyaさん
ご確認ありがとうございます。
app.configのエンコードはutf-8となっております。
(<?xml version="1.0" encoding="utf-8"?>)
>あと一応ですが、MIMEタイプに以下が無い場合は、追加されると良いかもしれません。>.config application/octet-stream
上記の設定も追加し試してみましたが、だめでした。。。
エラー内容から推測するに、.exe.configのハッシュ値がことなるようなことですが
IISからの実行では問題ないからハッシュ値が違うというようなことはないとおもうのです・・・
しかも.configにハッシュ値ってそもそも持ってるの?という感じです。
-
>しかも.configにハッシュ値ってそもそも持ってるの?という感じです。
例えば以下を読んでいただくと理解できると思いますが、app.configは事前にハッシュ値が計算されてマニフェストに保持されており、ダウンロードされてきた際にそのハッシュ値と比較し、改ざんを防止しています。
[ClickOnce Tips] アプリケーションの発行後に、アプリケーション設定ファイルの内容を編集するには
http://blogs.msdn.com/b/jpvsblog/archive/2011/05/26/clickonce-tips.aspxですから、サーバーにアップされた時か、クライアントにダウンロードされた時かでapp.configが変わってしまっているんじゃないかと思ったのです。よって、先の質問でエンコードが何か等を質問させていただきました。
とりあえず、サーバーにアップした際と、ダウンロードした際に、元のapp.configと変わっていないかを確かめて見られると良いかもしれません。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 渡邊 一間 2015年8月20日 5:50
-
たとえば、サーバーへの配置に FTP を用いていて、その時に ASCII モード転送による改行コード変換が入ってしまっていた…という可能性は無いでしょうか。
試しに、appName.exe.config.deploy の改行コードを変更してみたところ、今回のエラーを再現できました。
しかも.configにハッシュ値ってそもそも持ってるの?という感じです。
appName.exe.manifest ファイル内に、appName.exe や appName.exe.config に対応した <hash> タグがあります。
- 編集済み 魔界の仮面弁士MVP 2015年8月20日 4:30
- 回答としてマーク 渡邊 一間 2015年8月20日 5:51
-
>trapemiyaさん
情報ありがとうございました。
上記サイトに関しましては、構築の際にも参考にさせて頂いておりました。
内容からするとアプリケーション発行後に、手で発行先のapp.configを編集するとハッシュ値(及びサイズも)かわってしまい、マニフェストの記述と相違が発生してしまい、検証エラーが出ると認識しております。こちらについては認識正しいでしょうか?
なお、今回app.configは発行後に変更はしておらずVS上から初期で作りそのままの状態でClickOnceの発行を行っていた為、ハッシュ値に相違が発生することはないとの認識でいます。
>サーバーにアップされた時か、クライアントにダウンロードされた時かでapp.config
>が変わってしまっているんじゃないかと思ったのです。
上記のコメントからピンッときたのですが、もしかしたらApacheで.configがダウンロードされず検証を行う際に、.exe.configが見つからないためにエラーがでるのでは?
と思い立ち、再度httpd.confの内容を再確認しました。
まず確認の前に、サーバー上へアップしてある.configへのアクセスが可能かの検証
(直接URLで.exe.configへのアクセス)をしてみたところ、XMLが表示されずにエラーページ(Apacheでよくでるアクセスできなかった時のページ)が表示されました。
環境設定において記述をしていなかったのですが、Apacheの環境でASP.NETも利用しようと考えており、mod_aspdotnetの導入をして左記の情報設定もhttpd.confに記述している状況でした。
この中に
AddHandler config ASPX ASP···
の記述があり、こちらに引っかかってしまっているのではとおもい configを削除したところ思い通りの動作が実現できました。
こちらの環境を全て伝えきれずにお手を煩わせてしまい、大変申し訳ありませんでした。
また、さまざまな情報のご提供ありがとうございました。
- 編集済み 渡邊 一間 2015年8月20日 5:08
-
内容からするとアプリケーション発行後に、手で発行先のapp.configを編集するとハッシュ値(及びサイズも)かわってしまい、マニフェストの記述と相違が発生してしまい、検証エラーが出ると認識しております。こちらについては認識正しいでしょうか?
その認識で良いと思います。よって、ClickOnceを発行する前にapp.configの編集しておくと良いという例が以下にあります。
ClickOnce配置資材でWebサービスを利用する場合
http://vsug.jp/tabid/63/forumid/42/postid/2666/view/topic/Default.aspxちなみに、ファイルが見つからないと違うエラーが出ると思っていました。最初は何かブロックされているのかもしれないと思っていたのですが、思い込みは危険だということですね。失礼いたしました。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク 渡邊 一間 2015年8月20日 8:50