Asp.Net Core子应用因为配置中重复添加模块会引发IIS错误500.19

ASP.NET Core已经从IIS中解耦,能够做为自宿主程序运行,再也不依赖IIS。web

但咱们仍是须要强大的IIS做为前置服务器,IIS利用httpPlatformHandler模块来对后台的一些web服务器进行进程管理,好比Tomcat, Jetty, Node.exe, Ruby,固然还有dotnet,同时为它们代理分发网络请求。服务器

httpPlatformHandler是通用的、闭源的,并且貌似迭代的很慢,半年了还停留在带着一个大BUG的v1.2,多是因为这些缘由吧,.NET小组从httpPlatformHandler分支出来一个专门针对dotnet的版本,更名为AspNetCoreModule而且准备把它开源,这样应该能更好地适应.NET Core的发展。网络

 那么要使用IIS,则web.config是必须的,因此咱们看到项目文件里的web.config是这样配置的:app

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\WebApplication6.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
  </system.webServer>
</configuration>

 

 

很好理解,<add ../> 添加了一个AspNetCoreModule模块,名字为"aspNetCore",后面的<aspNetCore .. /> 则对这个模块的必要参数进行简单配置。asp.net

这样就告诉了IIS,在处理这个站点/应用的时候,使用aspNetCore这个模块,而这个模块则会启动dotnet并分发请求。spa

不过,当咱们在一个ASP.NET Core的站点下增长一个ASP.NET Core子应用的时候,.net

访问这个子应用会获得500.19错误:代理

HTTP 错误 500.19code

错误代码:0x800700B7orm

配置错误:在惟一密钥属性“name”设置为“aspNetCore”时,没法添加类型为“add”的重复集合项

查看这个子应用程序的配置,没法显示system.webServer/handlers节点,提示的错误和上图500.19中的配置错误一致:

咱们很容易想到,主站点的web.config里已经使用了"aspNetCore"这个名字,那么子应用就不能再用了。

试着修改subapp1的web.config,将"aspNetCore"随便改为其余的名字:

<add name="aspNetCore123" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />

 

这时再访问 /subapp1 就一切正常了。

可是这样更名字并非一个正确的方法:

提示这种错误是IIS自己一个正常的行为,由于在“website”站点根目录的web.config里,已经用<add ../>添加了模块AspNetCoreModuel了,在子应用里实际上再也不须要<add ../>来添加这个模块了,可是任然须要下面的<aspNetCore ../>来进行配置。

因此正确的作法是,在一个站点里,只在根目录web.config里保留<add ../>添加模块,其余子应用程序,都把这一节删除就能够了,即:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>    
    <aspNetCore processPath="dotnet" arguments=".\WebApplication6.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
  </system.webServer>
</configuration>

 

经@calvinK 提醒,更妥善的办法是先删除,再添加:

<?xml version="1.0" encoding="utf-8"?>
<configuration>      
  <system.webServer>    
   <handlers>
     <remove name="aspNetCore"/>
     <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
   </handlers>
   <aspNetCore processPath="dotnet" arguments=".\WebApplication6.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
  </system.webServer>
</configuration>

 

 

ps:能够加群 48082039 讨论C#,asp.net core相关话题。

相关文章
相关标签/搜索