gpt4 book ai didi

wcf - WCF 服务中莫名其妙的程序集负载 (IIS 7)

转载 作者:行者123 更新时间:2023-12-01 14:01:19 26 4
gpt4 key购买 nike

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

Could not load file or assembly 'System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.



问题是,这个服务似乎没有在任何地方引用这个(特定的)程序集。有一个加载 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 编译”选项卡给了我一个错误,即 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 时)以及我能做些什么来纠正它?

最佳答案

我弄清楚了这个问题,并认为它可能对可能遇到同样问题的其他人有所帮助。

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

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

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

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

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

    关于wcf - WCF 服务中莫名其妙的程序集负载 (IIS 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3417257/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com