最近基于.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:
那这种情况到底是怎么发生的呢?在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”.
以前在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”。
5. 找到并删除“svc-Integrated”。
问题解决了。
本文详细介绍了在部署基于.NET4.5的WebSocket服务器应用到WindowsServer2012和IIS8时遇到的异常问题,并提供了通过修改applicationHost.config文件来解决该问题的方法。

1356

被折叠的 条评论
为什么被折叠?



