ASP.NET Core 中的 Web 服务器实现

作者:Tom DykstraSteve SmithStephen HalterChris Ross

ASP.NET Core 应用与进程内 HTTP 服务器实现一起运行。 该服务器实现侦听 HTTP 请求,并以组成 HttpContext请求功能集形式,将它们呈现给应用。

Kestrel

Kestrel 是 ASP.NET Core 项目模板指定的默认 Web 服务器。

使用 Kestrel:

  • 本身作为边缘服务器,处理直接来自网络(包括 Internet)的请求。

    Kestrel 直接与 Internet 通信,不使用反向代理服务器

  • 与反向代理服务器 (如 Internet Information Services (IIS)NginxApache)结合使用。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。

    Kestrel 通过反向代理服务器(如 IIS、Nginx 或 Apache)间接与 Internet 进行通信

无论托管配置是否使用反向代理服务器,都是受支持的托管配置。

有关 Kestrel 配置指南和何时在反向代理配置中使用 Kestrel 的信息,请参阅 ASP.NET Core 中的 Kestrel Web 服务器实现

Nginx 与 Kestrel

若要了解如何在 Linux 上使用 Nginx 作为 Kestrel 的反向代理服务器,请参阅 使用 Nginx 在 Linux 上托管 ASP.NET Core

Apache 与 Kestrel

若要了解如何在 Linux 上使用 Apache 作为 Kestrel 的反向代理服务器,请参阅 使用 Apache 在 Linux 上托管 ASP.NET Core

HTTP.sys

如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。 为了获得最佳性能,通常建议使用 Kestrel。 在应用向 Internet 公开且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。 有关详细信息,请参阅 ASP.NET Core 中的 HTTP.sys Web 服务器实现

HTTP.sys 直接与 Internet 进行通信

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

HTTP.sys 直接与内部网络进行通信

有关 HTTP.sys 的配置指南,请参阅 ASP.NET Core 中的 HTTP.sys Web 服务器实现

ASP.NET Core 服务器基础结构

Startup.Configure 方法中提供的 IApplicationBuilder 公开了类型 IFeatureCollectionServerFeatures 属性。 Kestrel 和 HTTP.sys 各自仅公开单个功能,即 IServerAddressesFeature,但是不同的服务器实现可能公开其他功能。

IServerAddressesFeature 可用于查找服务器实现在运行时绑定的端口。

自定义服务器

如果内置服务器无法满足应用需求,可以创建一个自定义服务器实现。 .NET 的开放 Web 接口 (OWIN) 指南 演示了如何编写基于 NowinIServer 实现。 只有应用使用的功能接口需要实现,但至少必须支持 IHttpRequestFeatureIHttpResponseFeature

服务器启动

集成开发环境 (IDE) 或编辑器启动以下应用时,会启动服务器:

从项目文件夹中的命令提示符启动应用时,dotnet run 会启动该应用和服务器(仅 Kestrel 和 HTTP.sys)。 可通过 -c|--configuration 选项指定此配置,该选项设置为 Debug(默认值)或 Release

使用 dotnet run 或使用工具中内置的调试程序(如 Visual Studio)启动应用时,launchSettings.json 文件会提供配置 。 如果启动配置文件位于 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 的未来版本将支持 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 主机

下一篇:ASP.NET Core 中的配置

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程