Spiga

2023年5月的文章归档

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方法,将委托…… 阅读全文

ASP.NET Core 7 源码阅读1:启动过程

2023-05-08 18:38:14

摘要:一、从.NET Framework到.NET Core 1. 本质 .NET Framework:描述的是上层应用框架,底层就只支持windows平台, BCL CLR都是只有一个 .NET Core: 2016年.NETCore1.0,特点是3个CLR共存的(NET Framework、NER Core、XAMARIN) 最后个版本是.NET Core3.1 .NET5:终结3个分支,统一,一个CLR,一个BCL——2020年全球疫情,导致很多内容没完成 .NET6:口号也是统一平台,各种该实现的都实现了一下 .NET7:进一步完善统一,没有太大的变化,缝缝补补 2. 跨平台的理解 运行时CLR——CoreCLR C#程序——》编译器——》DLL/EXE(metadata、IL)——》CLR/JIT——》机器码 不能跨平台是因为只有一个CLR,不同的CLR匹配不同的平台 以前不能开发Linux的CLR,是因为NET Framework底层库依赖window,如IIS,画图库等 3. ASP.NET Core有哪些好处的功能 依赖注入 日志系统架构 引入了一个跨平台的网络服务器,kestrel 试用appsettings来配置工程 试用startup来注册服务 更好的支持异步编程 对于跨网站请求的预防和保护机制 验证令牌 @Html.AntiForgrtyToken 使用HTTPS 设置CSP(内容安全策略):定义哪些资源可以被加载和执行,减少XSS攻击风险 context.Response.Headers.Add(Content-Security-Policy, default-src 'self'; script-src 'self' https://xxx.com); 强大的验证和数据绑定功能:如[BindRequired]、[BindNever]属性 使用安全API端点设计:如JWT进行认证 4. ASP.NET Core有哪些更好的地方 跨平台 对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起 处理请求的效率更高,能够处理更多请求 更多安装配置方法 二…… 阅读全文