You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模式正确生效

  1. 检查Visual Studio启动配置

    • 右键项目 → 属性 → 调试,确认启动方式是IIS Express,而不是项目名称(选项目名称启动会用dotnet run,默认走OutOfProcess)。
    • 同时检查这里的环境变量,有没有手动覆盖ASPNETCORE_HOSTINGMODEL或者ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,这些会影响托管模式的生效。
  2. 验证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,这样判断更全面)

五、常见问题排查

  1. 为什么加了.UseIIS()还是没效果?

    • 在ASP.NET Core 2.2里,InProcess模式下.UseIIS()会被自动添加,手动写也没问题,但它主要是配置IIS集成的相关设置。如果是OutOfProcess模式,这个方法会配置反向代理的转发规则。
    • 还要确保你的Visual Studio是2019及以上版本,ASP.NET Core 2.2的InProcess托管需要对应版本的VS支持。
  2. 响应头还是显示Kestrel?

    • 这百分百说明应用是在OutOfProcess模式下运行的,赶紧检查你的启动方式是不是选了IIS Express,而不是直接用dotnet run或者项目名称启动。

内容的提问来源于stack exchange,提问作者Arun Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:22