3

私は、既存の ASP.NET Web アプリケーション内でホストされる新しい WCF Web サービスに取り組んでいます。サービスの .svc ファイルを実行しようとすると、アセンブリのファイルが見つからないという例外が発生します。

ファイルまたはアセンブリ 'System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

問題は、このサービスがこの (特定の) アセンブリをどこにも参照していないように見えることです。System.IdentityModel をロードする参照プロジェクトが 1 つありますが、それはバージョン 3.0.0.0 を参照しています。実際、これらのプロジェクトはすべて 3.5 ランタイムを対象としており、4.0 アセンブリへの参照はどこにもありません。

<compilation>Web アプリケーションの Web.config からのタグを次に示します。

<compilation debug="true">
  <assemblies>
    <clear/>
    <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
</compilation>

注: この<clear />タグは、トラブルシューティングの試みとして後で追加されました。行動への影響はないようでした。IIS構成マネージャーの「.NETコンパイル」タブで、System.Dataが2回追加されているというエラーが表示されたため、追加しましたが、明らかにこのファイルには含まれていません。追加<clear />することで問題は解決しましたが、問題のある複製が Machine.config に見つからず、ベース Web サイト Web.config がないため、探していない場所があるのではないかと考えています。問題の原因になります。

サーバーは、.NET 3.5 SP1 を搭載した Server 2008 を実行しています。.NET 4.0 を使用した Windows 7 x64 にあるローカルの IIS インストールで、同じ問題が発生します ( System.ConfigurationIdentityModel の代わりに使用しますが、それでも...)。

このアセンブリをロードしようとしている理由 (バージョン 3.0.0.0 のみが参照されている場合) と、それを修正するために何ができるかを知っている人はいますか?

4

1 に答える 1

1

私は問題を理解し、同じ問題に遭遇する可能性のある他の人に役立つかもしれないと考えました.

WCF サービスがアクティブ化されると、プロセスの一部でType.GetType(string)、サービス コントラクトの実装を表す型を取得するために使用されます。Type.GetType(string)ターゲット タイプが次のいずれかである必要があるためです。

  • 呼び出し元のアセンブリ (この場合、決してそうではありません)
  • mscorlib で (これも決してそうではありません)
  • アセンブリ修飾名で完全に指定

アセンブリ修飾名を使用して型が指定されていない限り、失敗します。

このため (また、名前空間修飾名だけでサービスの型を簡単に指定できるようにするため)、アクティベーターは参照されているすべてのアセンブリをスキャンしAssembly.GetType(string)、互換性のある型が見つかるまで (名前空間修飾名のみを使用できます) を呼び出します。

4.0 の参照が具体的にどこから来たのかを説明することはできませんが、参照されたアセンブリにあったに違いありません。ServiceHostサービスの .svc ファイル内のタグをアセンブリ修飾名を使用するように変更することで、WCF はサービスを正常に読み込みました。

于 2010-08-06T14:37:16.120 に答える