IIS8排错:Could not load type ‘System.ServiceModel.Activation.HttpModule’

本文详细介绍了在部署基于.NET4.5的WebSocket服务器应用到WindowsServer2012和IIS8时遇到的异常问题,并提供了通过修改applicationHost.config文件来解决该问题的方法。
最近基于.NET 4.5的WebSocket开发了一个服务器应用部署到Windows Server 2012和IIS8上去。调试的时候,每次打开网页就会遇到一个异常: "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)中声明了两个互相冲突的HTTP Module和两个互相冲突的HTTP Handler:
<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 Application的根配置,因此,默认情况下,每个web application都会加载这四个冲突的模块。其中,“ 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 application会抛出这个异常的根本原因!
那这种情况到底是怎么发生的呢?在Windows Server 2008上,如果在安装.NET 4.x之后才安装带Activation模块的.NET 3.x或者IIS 7.5,就会发生这种情况。 然而,在 Windows Server 2012上,只要安装了带Activation模块的.NET 3.x,就会发生这种情况。
微软官方发布了针对Windows Server 2008和IIS 7.5的解决方案( http://support.microsoft.com/kb/2015129):手动执行.NET 4.x的“ aspnet_regiis.exe /iru” (在 C:\Windows\Microsoft.NET\Framework\v4.0.30319或者 C:\Windows\Microsoft.NET\Framework64\v4.0.30319中). 然而, aspnet_regiis.exe是不允许对IIS 8执行的. 我尝试过手动修改 applicationHost.config,也试过卸载重装之类的办法,但是都没有成功。
最后我只好在IIS manager中把3.x的module和handler都删除掉了。如果你想保留 applicationHost.config中的3.x的module和handler,可以只从site或者application的级别去删除3.x的module和handler。但我想直接在 applicationHost.config中进行删除。于是我安装如下步骤进行:
1. IIS manager中,点击机器名。
2. 在“ Features View”中,双击“ Modules”.

3. 找到并删除ServiceModel”。


4. 回到机器level的Features View”,双击“ Handler Mappings”。

5. 找到并删除svc-Integrated”。


问题解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值