备注
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
重要
此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。
有关当前版本,请参阅本文的 .NET 9 版本。
作者:Tom Dykstra、 Steve Smith、Stephen Halter 和 Chris Ross
ASP.NET Core 应用与进程内 HTTP 服务器实现一起运行。 该服务器实现侦听 HTTP 请求,并以组成 的HttpContext集形式,将它们呈现给应用。
ASP.NET Core 随附以下组件:
使用 IIS 或 IIS Express 时,应用会在以下其中一个进程中运行:
ASP.NET Core 模块是本机 IIS 模块,用于处理 IIS 和进程内 IIS HTTP 服务器或 Kestrel 之间的本机 IIS 请求。 有关详细信息,请参阅用于 IIS 的 ASP.NET Core 模块 (ANCM)。
与 HTTP.sys 相比,Kestrel 具有以下优势:
- 更好的性能和内存利用率。
- 跨平台
- 灵活性,它是独立于操作系统进行开发和修补的。
- 编程端口和 TLS 配置
- 扩展性,允许 PPv2 等协议和备用传输。
Http.Sys 作为一个共享内核模式组件运行,并具备 Kestrel 所不具备的以下功能:
有几种承载模型可用:
Kestrel自承载:Kestrel Web 服务器无需任何其他外部 Web 服务器(如 IIS 或 HTTP.sys)即可运行。
HTTP.sys 自承载是 Kestrel 的替代方法。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。
IIS 进程内承载:ASP.NET Core 应用在与其 IIS 工作进程相同的进程中运行。 IIS 进程内承载相较 IIS 进程外承载提供更优的性能,因为请求并不通过环回适配器进行代理,环回适配器是一个网络接口,用于将传出的网络流量返回给同一计算机。 IIS 使用 Windows 进程激活服务 (WAS) 处理进程管理。
IIS 进程外承载:ASP.NET Core 应用在独立于 IIS 工作进程的进程中运行,而由模块来处理进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。 使用单独的进程还可以托管同一个应用池中的多个应用。
有关详细信息,请参阅以下部分:
Kestrel 服务器是默认跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。 有关详细信息,请参阅本文档中的 Kestrel 与 HTTP.sys。
使用 Kestrel:
无论托管配置是否使用反向代理服务器,都是受支持的托管配置。
有关 Kestrel 配置指南和何时在反向代理配置中使用 Kestrel 的信息,请参阅 ASP.NET Core 中的 Kestrel Web 服务器。
ASP.NET Core 随附以下组件:
使用 IIS 或 IIS Express 时,应用在独立于 IIS 工作进程(进程外)和 的进程中运行。
由于 ASP.NET Core 应用在独立于 IIS 工作进程的进程中运行,因此该模块会处理进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。
下图说明了 IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:

请求从 Web 到达内核模式 HTTP.sys 驱动程序。 驱动程序将请求路由到网站的配置端口上的 IIS,通常为 80 (HTTP) 或 443 (HTTPS)。 该模块将该请求转发到应用的随机端口(非端口 80/443)上的 Kestrel。
该模块在启动时通过环境变量指定端口,IIS 集成中间件将服务器配置为侦听 http://localhost:{port}
。 执行其他检查,拒绝不是来自该模块的请求。 该模块不支持 HTTPS 转发,因此即使请求由 IIS 通过 HTTPS 接收,它们还是通过 HTTP 转发。
Kestrel 从模块获取请求后,请求会被推送到 ASP.NET Core 中间件管道中。 中间件管道处理该请求并将其作为 HttpContext
实例传递给应用的逻辑。 IIS 集成添加的中间件会将方案、远程 IP 和 pathbase 更新到帐户以将请求转发到 Kestrel。 应用的响应传递回 IIS,IIS 将响应推送回发起请求的 HTTP 客户端。
有关 IIS 和 ASP.NET Core 模块的配置指南,请参阅以下主题:
若要了解如何在 Linux 上使用 Nginx 作为 Kestrel 的反向代理服务器,请参阅在 Linux 上使用 Nginx 托管 ASP.NET Core。
如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。 有关详细信息,请参阅 ASP.NET Core 中的 HTTP.sys Web 服务器实现。

对于仅向内部网络公开的应用,HTTP.sys 同样适用。

有关 HTTP.sys 配置指南,请参阅 ASP.NET Core 中的 HTTP.sys Web 服务器实现。
IApplicationBuilder 方法中提供的 Startup.Configure
公开了类型 ServerFeatures 的 IFeatureCollection 属性。 Kestrel 和 HTTP.sys 各自仅公开单个功能,即 IServerAddressesFeature,但是不同的服务器实现可能公开其他功能。
IServerAddressesFeature
可用于查找服务器实现在运行时绑定的端口。
如果内置服务器无法满足应用需求,可以创建一个自定义服务器实现。 .NET 的开放 Web 接口 (OWIN) 指南 演示了如何编写基于 Nowin 的 IServer 实现。 只有应用使用的功能接口需要实现,但至少必须支持 IHttpRequestFeature 和 IHttpResponseFeature。
集成开发环境 (IDE) 或编辑器启动以下应用时,会启动服务器:
从项目文件夹中的命令提示符启动应用时,dotnet run 会启动该应用和服务器(仅 Kestrel 和 HTTP.sys)。 可通过 -c|--configuration
选项指定此配置,该选项设置为 Debug
(默认值)或 Release
。
使用 launchSettings.json
或使用工具中内置的调试程序(如 Visual Studio)启动应用时,dotnet run
文件会提供配置。 如果启动配置文件存在于 launchSettings.json
文件中,请使用 --launch-profile {PROFILE NAME}
选项和 dotnet run
命令,或在 Visual Studio 中选择配置文件。 有关详细信息,请参阅 dotnet run 和 .NET Core 分发打包。
以下部署方案中的 ASP.NET Core 支持 HTTP/2:
- Kestrel
- 操作系统
- Windows Server 2016/Windows 10 或更高版本†
- 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
- macOS 10.15 或更高版本
- 目标框架:.NET Core 2.2 或更高版本
- HTTP.sys
- Windows Server 2016/Windows 10 或更高版本
- 目标框架:不适用于 HTTP.sys 部署。
- IIS(进程内)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 目标框架:.NET Core 2.2 或更高版本
- IIS(进程外)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
- 目标框架:不适用于 IIS 进程外部署。
†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。
- Kestrel
- 操作系统
- Windows Server 2016/Windows 10 或更高版本†
- 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
- macOS 的未来版本将支持 HTTP/2。
- 目标框架:.NET Core 2.2 或更高版本
- HTTP.sys
- Windows Server 2016/Windows 10 或更高版本
- 目标框架:不适用于 HTTP.sys 部署。
- IIS(进程内)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 目标框架:.NET Core 2.2 或更高版本
- IIS(进程外)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
- 目标框架:不适用于 IIS 进程外部署。
†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。
- Kestrel
- 操作系统
- Windows Server 2016/Windows 10 或更高版本†
- 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
- macOS 的未来版本将支持 HTTP/2。
- 目标框架:.NET Core 2.2 或更高版本
- HTTP.sys
- Windows Server 2016/Windows 10 或更高版本
- 目标框架:不适用于 HTTP.sys 部署。
- IIS(进程内)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 目标框架:.NET Core 2.2 或更高版本
- IIS(进程外)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
- 目标框架:不适用于 IIS 进程外部署。
†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。
- HTTP.sys
- Windows Server 2016/Windows 10 或更高版本
- 目标框架:不适用于 HTTP.sys 部署。
- IIS(进程外)
- Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
- 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
- 目标框架:不适用于 IIS 进程外部署。
HTTP/2 连接必须使用应用程序层协议协商 (ALPN) 和 TLS 1.2 或更高版本。 有关详细信息,请参阅与服务器部署方案相关的主题。
有关创建可靠、安全、高性能、可测试且可缩放的 ASP.NET Core 应用的指导,请参阅 企业 Web 应用模式。 可以提供实现这些模式的完整生产级示例 Web 应用。