ServiceHost の作成時に WCF が「System.ServiceModel」の FileNotFound 例外をスローする

StackOverflow https://stackoverflow.com/questions/934980

質問

WCF で非常に奇妙な問題が発生しています。ソリューション内に 2 つのプロジェクトがあり、それぞれがいくつかの自己ホスト型 WCF サービスを起動します。

プロジェクト 1:

myService = new ServiceHost(typeof(MyService1));

それはうまくいきます。ただし、次の内容を含む 2 番目のプロジェクトを実行しようとすると、

meService = new ServiceHost(typeof(MyOtherService));

例外が発生します:

FileNotFoundException
Could not load file or assembly 'System.ServiceModel' or one of its dependencies.
The system cannot find the file specified.":"System.ServiceModel

融合ログ:

=== Pre-bind state information ===
LOG: User = removed\removed
LOG: DisplayName = System.ServiceModel
 (Partial)
LOG: Appbase = file:///C:/Work/MySln/MyProj/bin/Dev
LOG: Initial PrivatePath = NULL
Calling assembly : System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Work\MySln\MyProj\bin\Dev\MyProj.dll.temp.config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel.DLL.
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel/System.ServiceModel.DLL.
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel.EXE.
LOG: Attempting download of new URL file:///C:/Work/MySln/MyProj/bin/Dev/System.ServiceModel/System.ServiceModel.EXE.

本当に奇妙なのは、この例外が発生したときに、デバッガーで Visual Studio の「QuickWatch」に移動して次のように入力できることです。

new MyOtherService()  // returns new instance properly
new ServiceHost()     // returns new instance properly
new ServiceHost(typeof(MyOtherService))  // throws exception, same as above.

デバッグ中に SysInternals File System Watcher を実行してみましたが、スタック トレースを生成するために .pdb ファイルを追跡しようとする devenv.exe 以外には、「FileNotFound」エラーは表示されませんでした。

他に何に注目すべきかアイデアがある人はいますか?


アップデート #1

このプロセスの融合ログを確認したところ、何か奇妙なことが起こっているようです。System.ServiceModel には、連続して 2 つのログ エントリがあります。

*** Assembly Binder Log Entry  (6/1/2009 @ 10:26:48 AM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  C:\Program Files\TestDriven.NET 2.0\ProcessInvocation.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = removed\removed
LOG: DisplayName = System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
 (Fully-specified)
LOG: Appbase = file:///C:/Work/MySln/PFWebIntgTests/bin/Dev
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = C:\Documents and Settings\removed\Local Settings\Temp\TestDrivenShadowCopy\633794488082894732
LOG: AppName = domain-nunit.addin.dll
Calling assembly : PFWebIntgTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Work\MySln\PFWebIntgTests\bin\Dev\PFWebIntgTests.dll.temp.config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
LOG: Found assembly by looking in the GAC.
LOG: Binding succeeds. Returns assembly from C:\WINDOWS\assembly\GAC_MSIL\System.ServiceModel\3.0.0.0__b77a5c561934e089\System.ServiceModel.dll.
LOG: Assembly is loaded in default load context.

次に 2 番目のエントリ:

*** Assembly Binder Log Entry  (6/1/2009 @ 10:26:52 AM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  C:\Program Files\TestDriven.NET 2.0\ProcessInvocation.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = removed\removed
LOG: DisplayName = System.ServiceModel
 (Partial)
LOG: Appbase = file:///C:/Work/MySln/PFWebIntgTests/bin/Dev
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = C:\Documents and Settings\removed\Local Settings\Temp\TestDrivenShadowCopy\633794488082894732
LOG: AppName = domain-nunit.addin.dll
Calling assembly : System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Work\MySln\PFWebIntgTests\bin\Dev\PFWebIntgTests.dll.temp.config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel.DLL.
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel/System.ServiceModel.DLL.
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel.EXE.
LOG: Attempting download of new URL file:///C:/Work/MySln/PFWebIntgTests/bin/Dev/System.ServiceModel/System.ServiceModel.EXE.
LOG: All probing URLs attempted and failed.

つまり、System.ServiceModel を 2 回ロードしようとし、1 回は GAC ではなくローカル アプリ ディレクトリからロードしようとしているようです。私は混乱しています...

役に立ちましたか?

解決

問題が見つかりました:

両方のプロジェクト (MyProj1 と MyProj2 と呼びます) の .dll.config ファイルに次の行があります。

<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="System.ServiceModel.ServiceAuthorizationManager, System.ServiceModel" />

Proj1 は正常に動作しますが、Proj2 は上記の例外が発生して失敗します。何らかの理由で、Proj2 のみでは、「System.ServiceModel」を解決しようとするときに、プライベート \bin フォルダーのみが検索されます。

上記の行を完全なアセンブリ名に変更すると、次のようになります。

<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="System.ServiceModel.ServiceAuthorizationManager, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

すべてが再び機能します。なんと奇妙なことでしょう...まったく同じ構成参照が、あるプロジェクトでは機能し、別のプロジェクトでは機能しない理由はわかりませんが、まあ...少なくとも今は仕事に戻れます:)

他のヒント

いくつかの質問:

  • 両方のプロジェクトは少なくとも .NET Framework 3.0 以降をターゲットにしていますか?
  • 2つのサービスが実装するインターフェースと、サービス実装クラス自体の大まかな概要を教えていただけますか。

2 番目のプロジェクトの参照を削除して、System.ServiceModel アセンブリに再度追加してみます。おそらく別の開発者が GAC バージョンではなくローカル ファイルを使用して追加したため、ローカル環境で問題が発生したのではないでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top