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相关话题。