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相關話題。

相關文章
相關標籤/搜索