使用 IIS 和 ASP.NET Core 进行进程外托管
注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
由于运行 ASP.NET Core 的进程与 IIS 工作进程分开,因此 ASP.NET Core 模块会负责进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。
下图说明了 IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:
- 请求从 Web 到达内核模式 HTTP.sys 驱动程序。
- 驱动程序将请求路由到网站的配置端口上的 IIS。 配置的端口通常是 80 (HTTP) 或 443 (HTTPS)。
- 此模块将该请求转发到应用的随机端口上的 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 |
若为 true ,IIS 集成中间件将设置经过 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>
的值不区分大小写,因此 inprocess
和 outofprocess
均为有效值。
使用 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 身份验证令牌。