ASP.NET Core 7 源码阅读2:Http管道和Kestrel
2023-05-29 10:48:46摘要:一、HttpPipeline 1. 理解Http请求流程 Http请求响应流程,也就是浏览器输入个地址,发生了什么事儿: 浏览器输入地址, www.xxx.com DNS解析,找到IP+Port,然后浏览器向该地址发Http报文---纯文本 Nginx/IIS/Kestrel监听端口,收到报文解析得到HttpContext 将请求转发到业务代码处理---怎么进入到controller+action? 处理结果由服务器回发到客户端,浏览器解析报文完成渲染 所谓HttpPipeline就是程序如何处理请求的全过程--- 理解Http管道所处的位置: Web服务器解析报文之后,在Web服务器回发报文之前 Http管道和controller-action的关系:其实是包含关系,任何处理动作都是管道的一部分 2. 理解Http管道 HttpPipeline本质是个啥? 接受HttpContext,然后做一系列的处理(Cookie Session 鉴权授权 缓存 路由 MVC)---最终将结果保存在HttpContext的Response里面 然后在ASP.NET Core里面,就被抽象成为一个委托—RequestDelegate---接受一个HttpContext,然后执行一系列操作 但是开发中,管道模型是很复杂的呀?因为Http请求的处理并不简单,包含了很多环节---Cookie/Session/鉴权授权/缓存/https/静态文件-------还有就是各种不同的业务处理需求(M-V-C)-----还有开发者的扩展需求(限流—黑名单白名单)-----所以需要一套扩展性的框架 这套实现,就是ASP.NET Core的HttpPipeline 3. 管道模型上帝视角 先创建个WebApplicationBuilder()---然后各种配置IOC/Logging/Configuration---然后Build()完成了各种初始化---得到WebApplication WebApplication去Use添加添加中间件(委托)---实际上是ApplicationBuilder在Use------就是把中间件(Func委托)保存到一个集合 最后框架在Run的时候,会执行ApplicationBuilder的Build方法,将委托…… 阅读全文