• Net Core子应用由于配置引起IIS错误500.19


    ASP.NET Core已经从IIS中解耦,可以作为自宿主程序运行,不再依赖IIS。

    但我们还是需要强大的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是这样配置的:

    复制代码
    <?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=".logsstdout" forwardWindowsAuthToken="false" />
      </system.webServer>
    </configuration>
    复制代码

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

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

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

    访问这个子应用会得到500.19错误:

    HTTP 错误 500.19

    错误代码:0x800700B7

    配置错误:在唯一密钥属性“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=".logsstdout" 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=".logsstdout" forwardWindowsAuthToken="false" />
      </system.webServer>
    </configuration>
    复制代码
  • 相关阅读:
    实时获取管道信息的一个小框架
    multiprocessing还是threading?
    QThread的一些使用心得
    super超类继承特点小结
    打靶总结
    简析Colorspace
    第一个Unity3D脚本
    一个新的计划,写在年末
    lambda函数的特性
    Nuke Python module的使用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5525806.html
Copyright © 2020-2023  润新知