使用 IIS 和 ASP.NET Core 进行进程外托管

注意

此版本不是本文的最新版本。 有关当前版本,请参阅本文.NET 9 版本。

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

有关当前版本,请参阅本文.NET 9 版本。

由于运行 ASP.NET Core 的进程与 IIS 工作进程分开,因此 ASP.NET Core 模块会负责进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。

下图说明了 IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:

进程外托管方案中的 ASP.NET Core 模块

  1. 请求从 Web 到达内核模式 HTTP.sys 驱动程序。
  2. 驱动程序将请求路由到网站的配置端口上的 IIS。 配置的端口通常是 80 (HTTP) 或 443 (HTTPS)。
  3. 此模块将该请求转发到应用的随机端口上的 Kestrel。 随机端口不是 80 或 443。

ASP.NET Core 模块在启动时通过环境变量指定端口。 UseIISIntegration 扩展将服务器配置为侦听 http://localhost:{PORT}。 执行其他检查,拒绝不是来自该模块的请求。 此模块不支持 HTTPS 转发。 即使请求由 IIS 通过 HTTPS 接收,它们还是通过 HTTP 转发。

Kestrel 从模块获取请求后,请求会被转发到 ASP.NET Core 中间件管道中。 中间件管道处理该请求并将其作为 HttpContext 实例传递给应用的逻辑。 IIS 集成添加的中间件会将方案、远程 IP 和 pathbase 更新到帐户以将请求转发到 Kestrel。 应用的响应传递回 IIS,IIS 将响应转发回发起请求的 HTTP 客户端。

有关 ASP.NET Core 模块配置指南,请参阅用于 IIS 的 ASP.NET Core 模块 (ANCM)

有关托管的详细信息,请参阅在 ASP.NET Core 中托管

应用程序配置

启用 IISIntegration 组件

CreateHostBuilder 中生成主机 (Program.cs),请调用 CreateDefaultBuilder 以启用 IIS 集成:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        ...

有关 CreateDefaultBuilder 的详细信息,请参阅 CreateDefaultBuilder

进程外承载模型

要配置 IIS 选项,请在 ConfigureServices 中包括 IISOptions 的服务配置。 下面的示例阻止应用填充 HttpContext.Connection.ClientCertificate

services.Configure<IISOptions>(options => 
{
    options.ForwardClientCertificate = false;
});
选项 默认 设置
AutomaticAuthentication true 若为 trueIIS 集成中间件将设置经过 Windows 身份验证进行身份验证的 HttpContext.User。 若为 false,则中间件仅提供 HttpContext.User 的 identity 并在 AuthenticationScheme 显式请求时响应质询。 必须在 IIS 中启用 Windows 身份验证使 AutomaticAuthentication 得以运行。 有关详细信息,请参阅 Windows 身份验证主题。
AuthenticationDisplayName null 设置在登录页上向用户显示的显示名。
ForwardClientCertificate true 若为 true,且存在 MS-ASPNETCORE-CLIENTCERT 请求头,则填充 HttpContext.Connection.ClientCertificate

代理服务器和负载均衡器方案

IIS 集成中间件和 ASP.NET Core 模块配置为转发:

  • 方案 (HTTP/HTTPS)。
  • 发起请求的远程 IP 地址。

IIS 集成中间件配置转发的标头中间件。

对于托管在其他代理服务器和负载均衡器后方的应用,可能需要附加配置。 有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器

进程外托管模型

若要配置进程外托管应用,请在项目文件 ( .csproj) 中将 <AspNetCoreHostingModel> 属性的值设置为 OutOfProcess

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

进程内托管设为 InProcess,这是默认值。

<AspNetCoreHostingModel> 的值不区分大小写,因此 inprocessoutofprocess 均为有效值。

使用 Kestrel 服务器,而不是 IIS HTTP 服务器 (IISHttpServer)。

对于进程外托管,CreateDefaultBuilder 会调用 UseIISIntegration 来进行以下操作:

  • 在 ASP.NET Core 模块后运行时,配置服务器应侦听的端口和基本路径。
  • 配置主机以捕获启动错误。

进程名

Process.GetCurrentProcess().ProcessName 报告 w3wp/iisexpress(进程内)或 dotnet(进程外)。

许多本机模块(如 Windows 身份验证)仍处于活动状态。 要详细了解随 ASP.NET Core 模块活动的 IIS 模块,请参阅 IIS 模块与 ASP.NET Core

ASP.NET Core 模块还可以:

  • 为工作进程设置环境变量。
  • 将 stdout 输出记录到文件存储器,以解决启动问题。
  • 转发 Windows 身份验证令牌。