我正在开发一个新的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时)以及我可以采取哪些措施来纠正它?
答案 0 :(得分:1)
我想出了这个问题,并认为这可能会对可能遇到同样问题的其他人有所帮助。
当激活WCF服务时,该过程的一部分使用Type.GetType(string)
来获取表示服务合同实现的类型。因为Type.GetType(string)
要求目标类型为:
除非使用其程序集限定名称指定类型,否则它将失败。
由于这一点(并且仅使用名称空间限定的名称来简化指定服务类型),激活器将扫描所有引用的程序集并调用Assembly.GetType(string)
(可以只使用名称空间限定的名称),直到它找到兼容的类型。
虽然我无法解释4.0引用的具体来源,但它必须在引用的程序集中。通过更改.svc文件中的ServiceHost
标记以使我的服务使用程序集限定名称,WCF成功加载了该服务。