65.9K
CodeProject 正在变化。 阅读更多。
Home

解决 IIS 8 错误:无法加载类型“System.ServiceModel.Activation.HttpModule”

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (23投票s)

2013 年 7 月 1 日

CPOL

2分钟阅读

viewsIcon

160265

如何解决 IIS 8 中的“无法加载类型 'System.ServiceModel.Activation.HttpModule’ ”错误

引言

我在将针对 .NET 4.5 的 WebSocket 服务器应用程序部署到 Windows Server 2012 加上 IIS 8 时遇到了一个错误。每当我尝试打开网页时,浏览器中会显示一个异常。该异常显示

"Could not load type ‘System.ServiceModel.Activation.HttpModule’ from assembly
 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'"

当我使用 IIS 7.5 时,我听说过这个问题,并且知道原因:applicationHost.config (位于 C:\Windows\System32\inetsrv\config)中的默认配置声明了两个冲突的模块和两个冲突的处理程序。

<modules>
  <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, 
  System.ServiceModel, Version=3.0.0.0, Culture=neutral, 
  PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
  <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule, 
  System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, 
  PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
</modules>
<handlers>
  <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-4.0" path="*.svc" verb="*" 
  type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, 
  System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, 
  PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

如我们所知,applicationHost.config 包含服务器上所有网站和 Web 应用程序的根设置。因此,任何 Web 应用程序默认情况下都会加载所有四个冲突的模块和处理程序。“ServiceModel”和“svc-Integrated”用于 .NET Activation 3.x,而“ServiceModel-4.0”和“svc-Integrated-4.0”用于 .NET Activation 4.x。不幸的是,3.x 项目在 4.x 项目之前声明。这就是 .NET 4.x Web 应用程序出现异常的原因!

那么这种情况是如何发生的呢?在 Windows Server 2008 上,如果在安装 .NET 4.x 框架或带有激活功能的 IIS 7.5 之后安装 .NET 3.x 框架,则可能会发生这种情况。但是,在 Windows Server 2012 上,在安装带有激活功能的 .NET 3.x 框架时,它总是会发生。

微软官方发布了针对 Windows Server 2008 加上 IIS 7.5 的解决方案(http://support.microsoft.com/kb/2015129):为 .NET 4.x 框架(位于 C:\Windows\Microsoft.NET\Framework\v4.0.30319C:\Windows\Microsoft.NET\Framework64\v4.0.30319)手动运行“aspnet_regiis.exe /iru”。但是,aspnet_regiis.exe 不允许在 IIS 8 上运行。我尝试手动更改 applicationHost.config。我还尝试以正确的顺序删除和添加功能。但所有这些解决方案都无法工作。

最终解决方案是从 IIS 管理器中删除 3.x 模块和处理程序。如果您想在 applicationHost.config 中保留它们,可以在应用程序或站点级别删除它们。但我希望从 applicationHost.config 中删除它们。因此,我执行了以下步骤

  1. 在 IIS 管理器中,单击**计算机名称**节点。
  2. 在“**功能视图**”中,双击“**模块**”。
  3. 找到“ServiceModel”并将其删除。

  4. 返回到**计算机名称**节点的“**功能视图**”,双击“**处理程序映射**”。
  5. 找到“svc-Integrated”并将其删除。

现在一切正常。

© . All rights reserved.