ASP.NET Core 2.2:如何获取iisexpress进程名及兼容两种托管模式?
解决ASP.NET Core同时支持InProcess/OutOfProcess托管并正确获取IIS Express进程名的问题
我之前也碰到过类似的托管模式和进程名获取的问题,咱们一步步来解决:
一、先搞懂两种托管模式的核心区别
- InProcess托管:应用直接运行在IIS/IIS Express进程内部,此时进程名应该是
iisexpress,响应头里不会出现Kestrel(因为Kestrel是作为内部服务器被IIS托管的)。 - OutOfProcess托管:应用独立运行在
dotnet进程里,IIS仅作为反向代理转发请求,此时响应头会显示Kestrel,进程名就是dotnet。
你已经在.csproj里配置了<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>但没生效,大概率是启动方式不对——你可能是用dotnet run直接启动的,而不是通过Visual Studio的IIS Express启动。
二、确保InProcess模式正确生效
检查Visual Studio启动配置
- 右键项目 → 属性 → 调试,确认启动方式是IIS Express,而不是项目名称(选项目名称启动会用
dotnet run,默认走OutOfProcess)。 - 同时检查这里的环境变量,有没有手动覆盖
ASPNETCORE_HOSTINGMODEL或者ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,这些会影响托管模式的生效。
- 右键项目 → 属性 → 调试,确认启动方式是IIS Express,而不是项目名称(选项目名称启动会用
验证InProcess是否真的生效
- 启动项目后打开任务管理器,查看是否有
iisexpress.exe进程,且内存占用和你的应用匹配。 - 用浏览器开发者工具查看响应头,InProcess模式下响应头会显示
Server: Microsoft-IIS/10.0(对应你的IIS Express版本),而非Kestrel。
- 启动项目后打开任务管理器,查看是否有
三、让项目同时支持两种托管模式
要同时支持InProcess和OutOfProcess,不需要硬写死配置,只要做到这两点:
- 可以把
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>留在.csproj里作为默认模式,同时允许通过环境变量覆盖。 - 或者直接删掉这个配置项,默认就是OutOfProcess,需要用InProcess时,通过环境变量
ASPNETCORE_HOSTINGMODEL=InProcess来切换。
比如.csproj可以这么写:
<PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <!-- 可选:设置默认托管为InProcess,也可以移除让它默认走OutOfProcess --> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> <RootNamespace>CookieStore</RootNamespace> </PropertyGroup>
切换模式的方式:
- 用Visual Studio选IIS Express启动:默认走InProcess(如果配置了的话)。
- 用
dotnet run启动:默认走OutOfProcess,或者在命令行先执行set ASPNETCORE_HOSTINGMODEL=InProcess && dotnet run(不过开发环境更推荐用IIS Express测试InProcess,因为dotnet run下InProcess需要额外配置)。
四、正确获取对应托管模式的进程名
你现在用System.Diagnostics.Process.GetCurrentProcess().ProcessName,在InProcess模式下本来应该拿到iisexpress,但前提是应用真的运行在IIS Express进程里。如果还是拿到dotnet,说明你根本没在InProcess模式下运行。
另外,更靠谱的方式是结合托管环境来判断,而不是只拿进程名:
using Microsoft.AspNetCore.Hosting; // 在Startup的构造函数里注入IHostingEnvironment(ASP.NET Core 2.2版本) private readonly IHostingEnvironment _hostEnv; public Startup(IHostingEnvironment hostEnv) { _hostEnv = hostEnv; } // 在Configure方法里 app.Run(async (context) => { await context.Response.WriteAsync("Hello World!\n"); string currentProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; string hostingMode = currentProcessName.Equals("iisexpress", StringComparison.OrdinalIgnoreCase) || currentProcessName.Equals("w3wp", StringComparison.OrdinalIgnoreCase) ? "InProcess" : "OutOfProcess"; await context.Response.WriteAsync($"当前进程名:{currentProcessName}\n"); await context.Response.WriteAsync($"当前托管模式:{hostingMode}"); });
(注:生产环境下IIS的进程名是w3wp,开发环境IIS Express是iisexpress,这样判断更全面)
五、常见问题排查
为什么加了
.UseIIS()还是没效果?- 在ASP.NET Core 2.2里,InProcess模式下
.UseIIS()会被自动添加,手动写也没问题,但它主要是配置IIS集成的相关设置。如果是OutOfProcess模式,这个方法会配置反向代理的转发规则。 - 还要确保你的Visual Studio是2019及以上版本,ASP.NET Core 2.2的InProcess托管需要对应版本的VS支持。
- 在ASP.NET Core 2.2里,InProcess模式下
响应头还是显示Kestrel?
- 这百分百说明应用是在OutOfProcess模式下运行的,赶紧检查你的启动方式是不是选了IIS Express,而不是直接用
dotnet run或者项目名称启动。
- 这百分百说明应用是在OutOfProcess模式下运行的,赶紧检查你的启动方式是不是选了IIS Express,而不是直接用
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

