ASP.NET Core 6 基础入门系列(13) Web 服务器介绍
- ASP.NET Core 6 基础入门系列(12) 项目的多种启动方式及问题
- ASP.NET Core 6 基础入门系列(11) 项目结构详解之项目入口Program.cs
- ASP.NET Core 6 基础入门系列(10) 项目结构详解之appsettings.json
- ASP.NET Core 6 基础入门系列(9) 项目结构详解之launchSettings.json
- ASP.NET Core 6 基础入门系列(8) 项目结构详解之MVC
- ASP.NET Core 6 基础入门系列(7) 项目结构详解之wwwroot
- ASP.NET Core 6 基础入门系列(6) 项目结构详解之依赖项
- ASP.NET Core 6 基础入门系列(5) 项目结构详解之项目文件管理
- ASP.NET Core 6 基础入门系列(4) 项目结构简介
- ASP.NET Core 6 基础入门系列(3) 新建 ASP.NET Core MVC 6.0 项目
- ASP.NET Core 6 基础入门系列(2) 开发环境准备
- ASP.NET Core 6 基础入门系列(1) ASP.NET Core 6 简介
在前一篇博客《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 是仅在 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 服务器是 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 Core项目所需的所有依赖项和工具包
- 生成项目及其所有依赖项
- 运行.NET Core 项目
安装 Visual Studio 2022 的过程中默认安装了.NET CLI的相关工具
测试一个命令看看效果
关于 .NET CLI 请参考微软文档:https://learn.microsoft.com/zh-cn/dotnet/core/tools/

在 .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 请求。
具体请参考我的博客
如果内置服务器无法满足应用需求,可以创建一个自定义服务器实现。 .NET 的开放 Web 接口 (OWIN) 指南 演示了如何编写基于 Nowin 的 IServer 实现。 只有应用使用的功能接口需要实现,但至少必须支持 IHttpRequestFeature 和 IHttpResponseFeature。

关于进程托管模型,请参考我的博客《ASP.NET Core 6 基础入门系列(15) 项目在IIS下部署的两种进程托管模型》
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、AI、DeepSeek、MiniMax、通义千问
2、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
3、jQuery、Vue.js、Bootstrap、ElementUI
4、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM、GaussDB、OpenGauss
5、架构:DDD、ABP、SpringBoot、jFinal
6、环境:跨平台、Windows、Linux
7、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
8、分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示