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

最近基于.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:

  
  


  
  
我们知道, 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”。

IIS8排错:Could not load type ‘System.ServiceModel.Activation.HttpModule’_第1张图片

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

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

IIS8排错:Could not load type ‘System.ServiceModel.Activation.HttpModule’_第2张图片

问题解决了。

你可能感兴趣的:(Web,Development)