ASP.NET Core 5应用IIS Express与自托管启动逻辑及端口差异问询
1. Main()方法断点命中时机差异的原因
两种启动方式对应不同的托管执行逻辑:
- 以项目名直接运行时,是直接启动dotnet进程加载你的应用程序集,启动流程会直接执行程序入口
Main()方法完成应用初始化、启动Kestrel服务器,所以启动时断点会立刻命中。 - 以IIS Express运行时,IIS Express本身是反向代理服务器,启动时仅完成自身服务初始化、端口监听、ASP.NET Core模块(ANCM)加载,不会启动你的应用进程。只有当第一个HTTP请求到达IIS Express时,ANCM才会触发启动你的ASP.NET Core应用进程,此时才会执行
Main()方法,所以断点要等首次请求才会命中。
2. IIS Express启动后、首次请求前运行的代码
这一阶段仅执行IIS Express自身的初始化逻辑,不会执行你写的应用代码:
- 读取IIS Express配置文件(
applicationhost.config),加载当前站点的绑定规则、权限配置、模块注册信息 - 启动HTTP.sys监听器,绑定配置好的HTTP、HTTPS端口等待请求
- 初始化ASP.NET Core模块(ANCM),但不会触发应用进程启动
3. 端口配置差异的原因
两者的端口配置逻辑完全独立:
- 以项目名直接运行是Kestrel自托管模式,5000(HTTP)、5001(HTTPS)是ASP.NET Core 5框架内置的默认端口,你可以通过
appsettings.json、环境变量、命令行参数自定义修改。 - IIS Express的端口是IIS Express的分配逻辑生成的,为了避免同一设备上多个IIS Express站点的端口冲突,默认会给每个站点随机分配两个未被占用的高位端口分别对应HTTP和HTTPS,你也可以在项目的
launchSettings.json或者IIS Express站点配置中手动指定固定端口。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

