WCF服务中无法解释的程序集加载(IIS 7)

时间:2010-08-05 17:09:30

标签: wcf iis-7 assembly-resolution

我正在开发一个新的WCF Web服务,该服务将托管在现有的ASP.NET Web应用程序中。当我尝试运行该服务的.svc文件时,我得到一个异常,它无法找到程序集的文件。

  

无法加载文件或程序集'System.IdentityModel,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其依赖项之一。该系统找不到指定的文件。

麻烦的是,这项服务似乎没有在任何地方引用这个(特定)程序集。有一个引用项目加载System.IdentityModel,但它引用版本3.0.0.0。实际上,所有这些项目都以3.5运行时为目标,并且在任何地方都没有对任何4.0程序集的引用。

以下是Web应用程序的Web.config中的<compilation>标记:

<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被添加两次,但显然不在此文件中。添加<clear />为我处理了它,但我在Machine.config中找不到有问题的副本,并且没有基本网站Web.config,所以我想知道是否有某个地方我'我不认为这可能是问题的原因。

服务器正在运行带有.NET 3.5 SP1的Server 2008。我在本地IIS安装上遇到了同样的问题(虽然使用System.Configuration而不是IdentityModel,但仍然是...),这是在带有.NET 4.0的Windows 7 x64上。

是否有人知道为什么它会尝试加载此程序集(仅引用版本3.0.0.0时)以及我可以采取哪些措施来纠正它?

1 个答案:

答案 0 :(得分:1)

我想出了这个问题,并认为这可能会对可能遇到同样问题的其他人有所帮助。

当激活WCF服务时,该过程的一部分使用Type.GetType(string)来获取表示服务合同实现的类型。因为Type.GetType(string)要求目标类型为:

  • 在调用程序集中(在这种情况下,它永远不会)
  • 在mscorlib中(再次,它永远不会)
  • 使用程序集限定名称
  • 完全指定

除非使用其程序集限定名称指定类型,否则它将失败。

由于这一点(并且仅使用名称空间限定的名称来简化指定服务类型),激活器将扫描所有引用的程序集并调用Assembly.GetType(string)(可以只使用名称空间限定的名称),直到它找到兼容的类型。

虽然我无法解释4.0引用的具体来源,但它必须在引用的程序集中。通过更改.svc文件中的ServiceHost标记以使我的服务使用程序集限定名称,WCF成功加载了该服务。