代码之家  ›  专栏  ›  技术社区  ›  Adam Robinson

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

  •  3
  • Adam Robinson  · 技术社区  · 14 年前

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

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

    问题是,此服务似乎没有在任何地方引用此(特定)程序集。有一个引用的项目加载System.IdentityModel,但它引用了版本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 compilation”选项卡给了我一个错误,即System.Data被添加了两次,但显然不在此文件中。添加 <清除/ 帮我处理好了,但是在machine.config中找不到有问题的副本,也没有基础网站web.config,所以我想知道我找不到的地方可能是导致问题的原因。

    服务器正在运行带有.NET 3.5 SP1的Server 2008。我也有同样的问题 System.Configuration 而不是IdentityModel,但是…)在我的本地IIS安装上,该安装在带有.NET 4.0的Windows 7 x64上。

    是否有人知道它为什么试图加载此程序集(仅引用版本3.0.0.0)以及我可以如何更正它?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Adam Robinson    14 年前

    我发现了这个问题,并认为它可能对其他可能遇到相同问题的人有所帮助。

    当激活WCF服务时,部分进程使用 Type.GetType(string) 获取表示服务合同实现的类型。因为 type.gettype(字符串) 要求目标类型为:

    • 在调用程序集中(在本例中,它永远不会是)
    • 在mscorlib(同样,它永远不会是)
    • 用程序集限定名完全指定

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

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

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