无法加载类型“System.ServiceModel.Activation.HttpHandler”与 WCF REST 的版本冲突

Posted

技术标签:

【中文标题】无法加载类型“System.ServiceModel.Activation.HttpHandler”与 WCF REST 的版本冲突【英文标题】:Could not load type 'System.ServiceModel.Activation.HttpHandler' Version conflict with WCF REST 【发布时间】:2011-06-04 22:31:49 【问题描述】:

我遇到了 WCF REST 服务的问题。我明白了:

无法从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”加载类型“System.ServiceModel.Activation.HttpHandler”。

在 ASP.NET 4.0 AppPool 中的 IIS 内部运行时。

问题似乎只有在以下情况下才会出现:

在 IIS 内部运行 启用 ASP.NET 兼容性时

在 Cassini 中运行 - 没问题,它可以正常工作。在 ASP.NET 兼容性关闭的情况下运行 - 没问题。

似乎是某种处理程序版本冲突,试图实例化错误版本的处理程序,进而尝试加载旧版本的 System.ServiceModel,但我无法追踪到这一点。

任何人以前见过这样的事情并有任何想法如何进一步追踪它?

我查看了 System.ServiceModel 和 HttpHandler 引用的 ApplicationHost.config 和主 web.config 文件,但没有运气。在那里。

+++ 瑞克 ---

【问题讨论】:

我也遇到了这个问题,但找不到解决办法。您可以在 web.config 中分享您用于 *.svc 的处理程序吗?我假设您在集成模式下运行 IIS7? 【参考方案1】:

因此,正如预期的那样,这是 ApplicationHost.config 中默认处理程序映射中的版本冲突。具体来说,IIS 具有对服务激活处理程序(和模块)的 ASP.NET 2.0 和 ASP.NET 4.0 特定引用的映射,并且 2.0 引用不受特定于版本的前置条件的限制。

要解决上述问题,我必须更改(在 ApplicationHost.config 的系统根目录):

<add name="svc-Integrated" path="*.svc" verb="*" 
type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" 
preCondition="integratedMode" />

到:

<add name="svc-Integrated" path="*.svc" verb="*"
type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"
preCondition="integratedMode,runtimeVersionv2.0" />

注意 EXPLICIT runtimeVersion2.0。在 runtimeVersion4.0 的同一部分中还有其他 *.svc 映射,然后会触发相应的运行时。

根据 Microsoft 的说法,当安装了一些未正确注册运行时版本的旧工具(我猜是 Azure 工具???)时,可能会出现这种情况。

问题解决了。

【讨论】:

谢谢!为了简化跨服务器管理版本,我只是将我的 .NET 4.0 Web 应用程序的 Web.config 更改为在 部分中说 ,并且完成了相同的工作。【参考方案2】:

启动您的 Visual Studio 2010 命令提示符或浏览到“C:\Windows\Microsoft.NET\Framework\ v4.0.30319”。并从命令提示符运行以下命令:

aspnet_regiis.exe -iru

这将注册最新的 .net 版本。还要确保您的应用程序池正在运行最新版本的 .net

【讨论】:

【参考方案3】:

如果以上所有方法都不起作用,还有另一种方法。 (奇怪)

我们使用的是带有 IIS 7.5.7600 的 Windows Server 2008 R2 SP1

按照上述答案注册最新框架后,

您需要手动将处理程序映射添加到 v.4.0 程序集到 web.config 并从模块中删除“ServiceModel”。

    <system.webServer>
        <handlers>
            <remove name="svc-Integrated" />
            <add name=".svc" verb="*" path="*.svc" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, 
System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </handlers>
        <modules>
            <remove name="ServiceModel" />
        </modules>
    </system.webServer>

更多here

【讨论】:

以上是关于无法加载类型“System.ServiceModel.Activation.HttpHandler”与 WCF REST 的版本冲突的主要内容,如果未能解决你的问题,请参考以下文章

错误:«无法加载类型 MvcApplication»

无法加载类型 ASP.ViewSwitcher

无法从程序集中加载类型

Global.asax 中的“解析器错误消息:无法加载类型”

无法加载一种或多种请求的类型。无法加载文件或程序集“Microsoft.VisualStudio.Coverage.CoreLib.Net

无法加载类型“AjaxControlToolkit.Sanitizer.AntiXssSanitizerProvider”。