注意
此版本不是本文的最新版本。 有关当前版本,请参阅 本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 有关当前版本,请参阅 本文的 .NET 9 版本。
作者 :汤姆·迪克斯特拉、 史蒂夫·史密斯、 斯蒂芬·霍尔特和 克里斯·罗斯
ASP.NET Core 应用与进程内 HTTP 服务器实现一起运行。 该服务器实现侦听 HTTP 请求,并以组成 的HttpContext集形式,将它们呈现给应用。
ASP.NET Core 随附以下组件:
-
Kestrel 服务器 是默认的跨平台 HTTP 服务器实现。
Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。 有关详细信息,请参阅 Windows 选项卡中的
vs. HTTP.sys。 - IIS HTTP 服务器是 IIS 的进程内服务器 。
- HTTP.sys 服务器 是基于 HTTP.sys 内核驱动程序和 HTTP 服务器 API 的仅限 Windows 的 HTTP 服务器。
使用 IIS 或 IIS Express 时,应用要么运行:
ASP.NET 核心模块是一个本机 IIS 模块,用于处理 IIS 与进程内 IIS HTTP 服务器之间的本机 IIS 请求或 Kestrel。 有关详细信息,请参阅适用于 IIS ASP.NET 核心模块(ANCM)。
Kestrel 与 HTTP.sys
与 HTTP.sys 相比,Kestrel 具有以下优势:
- 更好的性能和内存利用率。
- 跨平台
- 灵活性,它是独立于操作系统进行开发和修补的。
- 编程端口和 TLS 配置
- 支持 PPv2 协议和其他传输方式的扩展能力。
Http.Sys 作为一个共享内核模式组件运行,并具备 Kestrel 所不具备的以下功能:
- 端口共享
- 内核模式 Windows 身份验证。 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
Kestrel 服务器 是默认的跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。 有关详细信息,请参阅Kestrel和 HTTP.sys的对比,在本文档中。
使用 Kestrel:
本身作为边缘服务器,处理直接来自网络(包括 Internet)的请求。
使用 反向代理服务器,例如 Internet Information Services(IIS)、 Nginx 或 Apache。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。
无论托管配置是否使用反向代理服务器,都是受支持的托管配置。
有关 Kestrel 何时在反向代理配置中使用的 Kestrel 配置指南和信息,请参阅 Kestrel ASP.NET Core 中的 Web 服务器。
ASP.NET Core 随附以下组件:
- Kestrel 服务器 是默认的跨平台 HTTP 服务器。
- HTTP.sys 服务器 是基于 HTTP.sys 内核驱动程序和 HTTP 服务器 API 的仅限 Windows 的 HTTP 服务器。
使用 IIS 或 IIS Express 时,应用程序在独立于 IIS 工作进程的进程中运行(进程外),与 Kestrel 服务器 配合。
由于 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 模块的配置指南,请参阅以下主题:
Nginx 与 Kestrel
有关如何在 Linux 上使用 Nginx 作为反向代理服务器的信息,请参阅 Kestrel。
HTTP.sys
如果 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 服务器实现。
ASP.NET Core 服务器基础结构
IApplicationBuilder 方法中提供的 Startup.Configure
公开了类型 ServerFeatures 的 IFeatureCollection 属性。
Kestrel 和 HTTP.sys 各自仅公开单个功能,即 IServerAddressesFeature,但是不同的服务器实现可能公开其他功能。
IServerAddressesFeature
可用于查找服务器实现在运行时绑定的端口。
自定义服务器
如果内置服务器无法满足应用需求,可以创建一个自定义服务器实现。 .NET 的开放 Web 接口(OWIN)指南演示了如何编写基于 Nowin 的IServer实现。 只有应用使用的功能接口需要实现,但至少必须支持 IHttpRequestFeature 和 IHttpResponseFeature。
服务器启动
集成开发环境 (IDE) 或编辑器启动以下应用时,会启动服务器:
- Visual Studio:启动配置文件可用于使用 IIS Express/ASP.NET 核心模块 或控制台启动应用和服务器。
- Visual Studio Code:应用和服务器由 Omnisharp 启动,后者激活 CoreCLR 调试器。
从项目文件夹中的命令提示符启动应用时,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 分发打包。
HTTP/2 支持
在以下部署方案中,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/2 连接必须使用 Application-Layer 协议协商 (ALPN) 和 TLS 1.2 或更高版本。 有关详细信息,请参阅与服务器部署方案相关的主题。
企业 Web 应用模式
有关创建可靠、安全、高性能、可测试且可缩放 ASP.NET 核心应用的指南,请参阅 企业 Web 应用模式。 可以提供实现这些模式的完整生产级示例 Web 应用。