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