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

3
我在开发一个新的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.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 被添加了两次,但显然不是在这个文件中。添加 <clear /> 对我有帮助,但我找不到冒犯的重复项在 Machine.config 中,并且没有基本的网站 Web.config,所以我想知道是否有其他地方可能是问题的原因。
服务器运行 Server 2008 并安装了 .NET 3.5 SP1。我在本地的 IIS 安装上也遇到了同样的问题(虽然是关于 System.Configuration 而不是 IdentityModel,但仍然...),我的本地 IIS 安装在 Windows 7 x64 上,使用的是 .NET 4.0。 有人知道为什么它要尝试加载这个程序集(当只引用版本 3.0.0.0)以及我可以做什么来纠正它吗?
1个回答

1

我找到了问题所在,并认为这可能对那些可能遇到相同问题的人有所帮助。

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

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

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

由于这个原因(并且为了使仅使用命名空间限定名称更容易指定服务类型),激活器将扫描所有引用的程序集并调用Assembly.GetType(string)(它可以只采用命名空间限定名称)直到找到兼容的类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接