问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ASP.NET Core 6 基础入门系列(13) Web 服务器介绍

创作时间:
作者:
@小白创作中心

ASP.NET Core 6 基础入门系列(13) Web 服务器介绍

引用
1
来源
1.
https://www.cnblogs.com/SavionZhang/p/17032668.html

本文将介绍ASP.NET Core 6中常用的Web服务器,包括HTTP.sys、Kestrel和IIS服务器。通过对比它们的功能和使用场景,帮助开发者选择最适合的服务器配置。

在前一篇博客《ASP.NET Core 6 基础入门系列(12) .NET6 Web项目的多种启动方式及问题》中介绍了ASP.NET Core项目的多种启动方式,除了 IIS Express 方式是我们在.NET Framework 时代访问Web项目的常规方式之外,其余的几种方式都是启动了一个控制台程序并在其中承载Web运行的一切管理工作。思考一个问题:.NET Core/.NET5/.NET6+ 为什么将Web项目生成的应用程序类型默认设置为控制台应用程序?这是微软迈出跨平台的重要一步,摆脱IIS的束缚,重新开发跨平台Web运行服务器。

HTTP.sys 服务器

HTTP.sys 是仅在 Windows 上运行的适用于 ASP.NET Core 的 Web 服务器。其本质上就是一个HTTP/HTTPS监听器,它是Windows网络子系统的一部分,是一个在内核模式下运行的网络驱动。HTTP.SYS对应的驱动文件为“%WinDir\System32\drivers\http.sys”

不要小看这个只有1MB多的文件,Windows针对http的监听、接收、转发和响应几乎都依赖它。如图所示,HTTP.SYS建立在Windows网络子系统的TCP/IP协议栈的驱动(TCPIP.SYS)之上,并为用户态运行的IIS提供了基础的HTTP通信服务。前面使用的HttpListener也建立在HTTP.SYS上面。

由于HTTP.SYS是在操作系统内核态运行,所以它提供的性能优势是其他在用户态运行的同类产品无法比拟的。由于它自身提供响应缓存,所以在缓存命中的情况下根本不需要与用户态进程进行交互。它还提供了请求队列(Request Queue),如果请求的目标进程(如IIS的工作进程)处于活动状态,则可以直接将请求分给它,否则请求会暂存于队列中等待目标进程来提取,这样的工作模式既减少了内核态与用户态之间的上下文切换,也确保请求不会丢失。HTTP.SYS还提供了连接管理、流量限制和诊断日志等功能,并对Kerberos的Windows实现认证。

由于HTTP.SYS是一个底层共享的网络驱动,它有效地解决了端口共享的问题。用户态进程会使用地址前缀(含端口)接入HTTP.SYS,HTTP.SYS利用提供的地址前缀来转发请求,多个用户态进程只需要保证提供的地址前缀不同,所以它们可以使用相同的端口。端口共享使每个用户进程都可以使用标准的80/443端口。

HTTP.sys 是 Kestrel 服务器的替代选择,提供了一些 Kestrel 不提供的功能。

(1)HTTP.sys 支持以下功能

  • Windows 身份验证
  • 端口共享
  • 具有 SNI 的 HTTPS
  • 基于 TLS 的 HTTP/2(Windows 10 或更高版本)
  • 直接文件传输
  • 响应缓存
  • WebSocket(Windows 8 或更高版本)

(2)受支持的 Windows 版本

  • Windows 7 或更高版本
  • Windows Server 2008 R2 或更高版本

(3)HTTP.sys 对于以下情形的部署来说很有用

  • 需要将服务器直接公开到 Internet 而不使用 IIS 的部署
  • 内部部署需要 Kestrel 中没有的功能

HTTP.sys 是一项成熟的技术,可以抵御多种攻击,并提供可靠、安全、可伸缩的全功能 Web 服务器。 IIS 本身作为 HTTP.sys 之上的 HTTP 侦听器运行。

(4)配置 ASP.NET Core 应用以使用 HTTP.sys

提示

  • HTTP.sys 与 ASP.NET Core 模块不兼容,无法与 IIS 或 IIS Express 结合使用。
  • 由于 HTTP.sys 仅支持 Windows 平台,所以跨平台的情况下不能使用。

如果只需要将 ASP.NET Core 应用部署到 Windows 环境下,并且希望获得更好的性能,那么选定的服务器类型应该是 HTTP.Sys。Windows 环境下任何针对 HTTP 的网络监听器/服务器在性能上都无法与 HTTP.Sys 相媲美。

HTTP.sys 服务器还有很多强大的功能,请参考《ASP.NET Core 中的 HTTP.sys Web 服务器实现》

Kestrel 服务器

Kestrel 服务器是 ASP.NET Core 的跨平台 Web 服务器实现。.NET Core 支持的所有平台(Windows Server 、Linux、MacOS、Unix)和版本都支持它,它默认作为内部服务器包含在 ASP.NET Core 中。

未使用 IIS 托管时,ASP.NET Core 项目模板默认使用 Kestrel 服务器。WebApplication.CreateBuilder 方法在内部调用 UseKestrel() 方法:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();

应用场景:

  • 本身作为边缘服务器,处理直接来自网络(包括 Internet)的请求
  • 与反向代理服务器(如Internet Information Services (IIS)、Nginx或Apache)结合使用。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel

无论托管配置是否使用反向代理服务器,都是受支持的托管配置。有关 Kestrel 配置指南和何时在反向代理配置中使用 Kestrel 的信息,请参阅ASP.NET Core 中的 Kestrel Web 服务器实现。

如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项之一。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。

Kestrel 对比 HTTP.sys

与 HTTP.sys 相比,Kestrel 具有以下优势:

  • 更好的性能和内存利用率
  • 跨平台
  • 灵活性,它是独立于操作系统进行开发和修补的
  • 编程端口和 TLS 配置
  • 扩展性,允许 PPv2 等协议和备用传输

Http.Sys 作为共享内核模式组件运行,具有 kestrel 不具备的以下功能:

  • 端口共享
  • 内核模式 Windows 身份验证。 Kestrel 仅支持用户模式的身份验证
  • 通过队列传输的快速代理
  • 直接文件传输
  • 响应缓存

在Kestrel中,用于托管应用程序的进程是 dotnet.exe。当我们使用 .NET Core CLI 运行 ASP.NET Core 应该用程序时,应用程序使用 Kestrel 作为 Web 服务器。

在ASP.NET Core 中配置 Kestrel 服务器

或者在appsetting.config中配置

Kestrel Web 服务器的功能十分强大,详细功能请参考微软文档《为 ASP.NET Core Kestrel Web 服务器配置选项》

.NET CLI 工具

.NET 命令行接口 (CLI) 工具是用于开发、生成、运行和发布 .NET 应用程序的跨平台工具链。使用CLI命令可以实现丰富的工作,包括但不限于以下内容:

  • 根据指定的模板创建新项目、配置文件或解决方案
  • 还原.NET Core项目所需的所有依赖项和工具包
  • 生成项目及其所有依赖项
  • 运行.NET Core 项目

安装 Visual Studio 2022 的过程中默认安装了.NET CLI的相关工具

测试一个命令看看效果

关于 .NET CLI 请参考微软文档:https://learn.microsoft.com/zh-cn/dotnet/core/tools/

《ASP.NET Core 6 基础入门系列(12) .NET6 Web项目的多种启动方式及问题》中的启动方式1、方式3、方式4,由于托管在Kestrel中,因此应用程序的的进程是 dotnet.exe。

IIS服务器(或IIS Express)

在 .NET Framework 时代的 ASP.NET Web 项目的部署只有 Windows Server操作系统上支持的唯一IIS服务器,到了.NET Core 跨平台时代,IIS 在 Windows Server 操作系统上同样支持 ASP.NET Core Web 项目的部署。

使用 IIS 或 IIS Express 时,应用会在以下其中一个进程中运行:

  • 在使用 IIS HTTP 服务器的 IIS 工作进程(进程内托管模型)相同的进程中。 “进程内”建议的配置。
  • 在独立于 IIS 工作进程(进程外托管模型)和 Kestrel 服务器的进程中。

ASP.NET Core 模块 是本机 IIS 模块,用于处理 IIS 和进程内 IIS HTTP 服务器或 Kestrel 之间的本机 IIS 请求。

具体请参考我的博客

  • ASP.NET Core 6 基础入门系列(15) 项目在IIS下部署的两种进程托管模型
  • ASP.NET Core 6 基础入门系列(14) 项目发布与IIS部署

自定义Web服务器

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

不同的启动方式对应的服务器

关于进程托管模型,请参考我的博客《ASP.NET Core 6 基础入门系列(15) 项目在IIS下部署的两种进程托管模型》

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号