Asp.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=".\logs\stdout" 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=".\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相關話題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM