正如标题所示,我们需要在IIS 8.5 Windows Server 2012中完全更新并排托管两个不同的网站(每个网站都有自己的应用程序池)。
一个站点是ASP.NET MVC5并以32位模式运行,而另一个站点是以64位模式运行的.netcore2.2网站。
.netcore2.2需要在IIS中加载AspNetModuleCoreV2.dll。问题是这导致32位网站在加载时崩溃(503服务不可用)。
如果我们从ApplicationHost.config中删除64位AspNetModuleCoreV2.dll指向:
C:\Program Files\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll
(or even replace it with the 32bit flavor C:\Program Files (x86)\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll)
然后32位网站工作正常,但这导致64位.netcore2.2网站失败。
那么我们怎样才能让这两个网站在IIS8.5的同一屋檐下开心呢?我们尝试过的事情:
在32位网站的web.config中使用remove-handler调整:
<handlers>
<remove name="AspNetCoreModule" />
<remove name="AspNetCoreModuleV2" />
</handlers>
不幸的是,这没有用。仍然得到503(更新:好主意糟糕的执行 - 请阅读下面 - 我们可能会对此进行蠢事!)
更新:嗯,在写这两件事时几乎立即出现在我们的脑海中:
< system.webServer >
< modules >
< remove name="AspNetCoreModule" />
< remove name="AspNetCoreModuleV2" />
< /modules>
< system.webServer>
代替:
%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll
环境变量是可能在32位网站上产生差异的差异。去尝试一下。
原来,罪魁祸首确实是(无论出于什么原因).netcore2.2的运行时安装程序决定在IIS的ApplicationHost.config中硬编码'aspnetcorev2.dll'的路径,让它指向C:\ Program Files .. 。
如前所述,注册模块的正确方法是:
%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll
这样,当一个网站以32位模式运行时,它将加载正确的dll风格:
C:\Program Files (x86)\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll
从那时起,一切都会奏效。
如果你想在部署到无法控制的客户端服务器时发挥它的额外安全性,你可能还需要在32位ASP.NET MVC5的Web.config中另外明确删除任何和所有'aspnetcorev2'模块,如下所示:
< system.webServer >
< modules >
< remove name="AspNetCoreModule" />
< remove name="AspNetCoreModuleV2" />
< /modules>
< system.webServer>