Spiga

2023年6月的文章归档

ASP.NET Core 7 源码阅读4:MVC核心中间件

2023-06-26 16:24:03

摘要:一、核心流程概述 执行AddMVC() 将MVC的核心服务注册到容器,且通过反射扫描把相关dll收集起来 执行app.UseRouting() 将EndpointRoutingMiddleware中间件注册到http管道 执行app. MapControllerRoute() 将本程序集定义的所有Controller-Action-ParameterConversion转换为一个个的ControllerActionDescriptor放到路由中间件的配置对象RouteOptions中,注册并传入EndpointMiddleware中间件注册到http管道中 请求来了,管道模型Build---没啥动作,倒序执行中间件的实例化 收到一条http请求,先进入EndpointRoutingMiddleware,首次请求时会完成ControllerActionDescriptor到EndPoint的转化,然后通过DFA算法匹配一个Endpoint,并放到HttpContext中去 鉴权/授权/其他中间件可以根据根据Endpoint的信息对这个请求进行鉴权授权或其他操作。 EndpointMiddleware中间件执行Endpoint中的RequestDelegate逻辑,即执行FilterController-Action-Result等系列操作(MVC) 二、AddMVC 1. 上帝视角 AddMVC(AddControllersWithViews)是最初发生的,是IOC注册环节的事儿,在管道注册之前,其职责有2个: 添加MVC各种IOC注册,超多。。 反射遍历相关程序集,封装成ApplicationPart,供后续使用 2. 源码解读 从MvcServiceCollectionExtensions开始,绕一圈,最终是AddMvcCore()方法 先实例化ApplicationPartManager-----拿着项目名字,通过反射加载Dll,将信息封装到ApplciationPartManager的ApplicationParts属性中---扩展点 ConfigureDefaultFeatureProviders(partManager);的调用,这行代码是创建了一个新的ControllerFeatureProvide…… 阅读全文

ASP.NET Core 7 源码阅读3:基础中间件

2023-06-11 23:26:04

摘要:一、ExceptionHandler ASP.NET Core管道最外面,就是app.UseExceptionHandler(/Home/Error);这个是全局异常处理,这个/Home/Error在哪里? 直接看源码 UseExceptionHandler----ExceptionHandlerExtensions,开启新的Http管道,里面就是个ExceptionHandlerMiddlewareImpl------注册中间件 异常真的发生了,中间件的Invoke方法,看catch里面,最终是到ErrorPage.design.cs文件---请求响应时 没有Add,因为太简单了---没啥东西 中间件其实有3件事儿: AddXXX----builder.Build()期间,去完成的IOC注册 UseXXXX---app.Run()期间,去完成中间件注册,组装Http管道 Middleware的InvokeAsync()—请求响应时,才执行 关于全局异常处理中间件和Filter的区别 ExceptionHandlerMiddleware是全局性质,是兜底的----而ExceptionFilter其实只管控制器-Action的异常,是管不了View-ResultFilter的异常 精细度不同,中间件只知道模糊信息,不适合做业务处理----ExceptionFilter贴近业务的,可以返回业务信息 其实完整的异常方案,就应该是二者叠加-- 二、HTTPS HstsMiddleware HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写效果是:优先使用https---如果有https,就使用这个 源码解读: HstsMiddleware-----就是设置个header--- Strict-Transport-Security= maxage= HttpsRedirection UseHttpsRedirection 就是优先访问https,访问http会自动跳转(后台有配置https)效果:直接VS的https启动,访问http,开关中间件尝试https://localhost:7066 http://localhost:7067 …… 阅读全文