ASP.NET Core中Kestrel实例分配规则及客户端请求流转路径问询
ASP.NET Core Kestrel相关问题解答
多应用部署的Kestrel实例分配
每个独立部署的ASP.NET Core Web应用,都会启动独立的Kestrel实例处理自身请求。
Kestrel是ASP.NET Core内置的进程内服务器,和应用本身同属一个进程,不同应用的进程互相隔离,所以各自的Kestrel实例也完全独立,会绑定专属的端口、配置独立的请求规则,互不干扰。
只有非常特殊的单进程多模块聚合部署场景(实际生产几乎不会使用)才会出现单个Kestrel实例处理多个应用逻辑的情况,常规部署下都是一应用对应一个Kestrel实例。
ASP.NET Core请求完整流转过程
从客户端发起请求到收到响应的全流程如下:
- 客户端发起HTTP/HTTPS请求,先到达服务器的公网入口,如果配置了Nginx、IIS、YARP这类反向代理服务,代理会先根据域名、路径等匹配规则,将请求转发到对应ASP.NET Core应用的Kestrel监听端口。
- Kestrel接收到原始网络请求后,会把报文解析为标准化的
HttpContext对象,包含请求头、请求体、请求方法、URL等所有上下文信息。 - 请求进入ASP.NET Core的中间件管道,该管道的执行顺序由
Program.cs中编写的app.UseXXX()系列注册逻辑决定,会依次经过异常处理、静态文件匹配、路由解析、身份认证、授权等环节,每个中间件都可以处理请求、修改上下文,也可以直接短路返回响应。 - 路由中间件匹配到对应的Controller/Action或者Minimal API端点后,执行对应的业务代码,生成响应数据。
- 响应会按照中间件注册的逆序,依次经过各个中间件的响应处理逻辑,最终交给Kestrel。
- Kestrel将响应内容序列化为标准HTTP报文,返回给反向代理(如果有配置),再由代理返回给客户端。
补充说明:Program.cs是ASP.NET Core应用的启动入口,调用WebApplication.CreateBuilder()时内部就会默认初始化Kestrel的基础配置,你也可以通过builder.WebHost.UseKestrel()方法自定义Kestrel的端口、证书、连接限制等参数,Kestrel负责底层网络通信,上层的请求处理逻辑完全由你在Program.cs中配置的管道规则决定。
内容的提问来源于stack exchange,提问作者Shan Shimb3o
相关产品推荐
相关产品推荐

