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

Asp.Net Core子应用由于配置中重复添加模块会引起IIS错误500.19的更多相关文章

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

    Asp.Net Core子应用由于配置中重复添加模块会引起IIS错误500.19 ASP.NET Core已经从IIS中解耦,可以作为自宿主程序运行,不再依赖IIS. 但我们还是需要强大的IIS作为前 ...

  2. [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  3. [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步

    在<配置模型总体设计>介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文章来专门讨论这个话题.配置的同步涉及到两个方面:第一,对原始的配置源实施监控并 ...

  4. [ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计

    在<读取配置数据>([上篇],[下篇])上面一节中,我们通过实例的方式演示了几种典型的配置读取方式,接下来我们从设计的维度来重写认识配置模型.配置的编程模型涉及到三个核心对象,分别通过三个 ...

  5. [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]

    物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  6. [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象

    虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...

  7. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  8. ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制

    我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...

  9. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

随机推荐

  1. RPC通信框架——RCF介绍

    现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实现跨平台,支持Linux系统,以及后续的分布式,首要任务是去除COM接口. ...

  2. 大白话讲解Promise(一)

    去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范.作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise的基本 ...

  3. java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

    java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 严重: Exceptio ...

  4. 我如何介绍 Microservice

    这篇文章转自我的 Github blog 一天我司招财猫姐(HR 大人)问我,你给我解释一下 Microservice 是什么吧.故成此文.一切都是从一个创业公司开始的. 故事 最近的创业潮非常火爆, ...

  5. Android开发学习之路-回调机制学习笔记

    不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...

  6. JS中script词法分析

    核心:JS中的script是分段执行的. <script> var i = 10; </script> <script> alert(i); </script ...

  7. Python标准库的threading.Thread类(转自别人的翻译)

    这个类表示在单独的控制线程中运行的活动.有两种方法可以指定这种活动,给构造函数传递回调对象,或者在子类中重写run() 方法.其他方法(除了构造函数)都不应在子类中被重写.换句话说,在子类中只有__i ...

  8. JS 原型,检索,更新,引用等

    <script type="text/javascript"> var myObject=maker({ first:f, last:1, state:s, city: ...

  9. 关于SubSonic3.0插件更新字符串过长引发的System.Data.SqlClient.SqlException的异常修复

    最近公司客服提交了个BUG,说是更新产品详细信息时,有的可以有的更新不了,前段时间一直没空所以暂时放下,刚才又出现这个问题,所以马上处理了一下. 打开项目解决方案,进入DEBUG模式,拿到操作的数据提 ...

  10. Objective-C中小怪兽的逻辑

    学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把.在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧.从小怪兽的角度来讲,怪兽都有那些行 ...