Net6 请求管道处理

1 new WebHostBuilder ,并传入 IHostBuilder 和 ApplicationBuilder 并初始化 , 执行委托 创建HttpListenerServer 服务,没有则返回默认 监听地址,
注册中间件,获取监听地址, 遍历 生成管道 对象 requestDelegate 生成时 // 执行了 注册的 中间件。

创建 并返回WebHostedService (传入 监听地址 和 生成requestDelegate ),

并启动 Run方法,官方源码中通过 IServiceProvider获取 IEnumerable<IHostedService> 然后遍历 调用start方法 启动 ,遍历监听地址添加到 HttpListener监听中 启动监听

然后请求监听地址,获取监听 请求的对象 HttpListenerContext, HttpListenerFeature 将 HttpListenerContext 传入 转为 HttpListenerFeature 。(HttpListenerFeature 作为一个适配,或者中间厂商转化,实现接口 IHttpRequestFeature, IHttpResponseFeature)

创建 FeatureCollection (一个 字典 对象 Dictionary<Type, object?>,

在 将 HttpListenerFeature 通过 set 传入 FeatureCollection中,通过set的泛型<IHttpRequestFeature, IHttpResponseFeatur>和传入 的HttpListenerFeature 对应
并存入字典,
然后返回 IFeatureCollection 传入new HttpContext对象, (new HttpRequest 对象 和一个 HttpResponse) 和刚刚 set 一样,通过字典的 trygetvalue 配合 泛型在取出
返回 生成 HttpRequest和HttpResponse) ,生成HttpContext, 独对象

然后 作为参数 传入 管道 继续执行 注入的中间件 和返回

  

 


承载 服务
WebHostedService


承载服务帮助类,帮助 WebHostedService 生成 Iserver 和 requestDelegate 管道的生成
WebHostBuilder

 

代码
var webHostBuilder = new WebHostBuilder(builder, new ApplicationBuilder()); configure?.Invoke(webHostBuilder); builder.ConfigureServices(svcs => svcs.AddSingleton<IHostedService>(provider => { var server = provider.GetRequiredService<IServer>(); var handler = webHostBuilder.ApplicationBuilder.Build();//此处将注入的中间件 生成为管道requestDelegate  return new WebHostedService(server, handler); }));

  

 

posted @ 2023-05-23 21:39  孤海飞雁  阅读(133)  评论(0编辑  收藏  举报