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

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

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

ASP.NET Core Module in the out-of-process hosting scenario

  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 的标识并在 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 身份验证令牌。