Spiga

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);的调用,这行代码是创建了一个新的ControllerFeatureProvider实例放进了partManager的Fea…… 阅读全文

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 源码: HttpsPolicyBuilderExtension…… 阅读全文

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方法,将委托集合遍历调用,组装成最终的RequestDel…… 阅读全文

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有哪些更好的地方 跨平台 对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起 处理请求的效率更高,能够处理更多请求 更多安装配置方法 二、ASP.NET Core启动流程 创建WebApplicationBuilder:做一些信息读取 配置WebApplicationBuilder:各种…… 阅读全文

WPF学习笔记5:MVVM

2022-09-04 23:46:49

摘要:一、了解MVVM 1. 什么是MVVM 一种设计模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 为什么需要MVVM?解决什么问题? 降低耦合、独立开发、逻辑重用(Xamarin MAUI多平台应用)、可测试 响应式布局 2. 控件交互到MVVM模式的转变 控件交互:基于控件的功能开发 -MVVM****模式 代码/项目结构 Models: Views: ViewModels: 3. MVVM绑定模式下的信息交互 数据类型:INotifyPropertyChanged接口 public event PropertyChangedEventHandler? PropertyChanged; 执行事件,发公告 ContextMenu,注意:命令的数据源的指定 行为动作:ICommand接口 public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) public void Execute(object? parameter) 是不是所有控件都有Command属性?是不是所有动作都可以使用Command? 无法绑定的动作如何处理? 4. MVVM绑定扩展 无法绑定的对象属性 通过附加属性进行扩展 无法绑定的动作事件 (InputBindings: ) 单击鼠标左键 :LeftClick 双击鼠标左键:LeftDoubleClick 单击鼠标中键 :MiddleClick 双击鼠标中键:MiddleDoubleClick 单击鼠标右键:RightClick 双击鼠标右键:RightDoubleClick 不执行任何操作:None 旋转鼠标滚轮:WheelClick 事件转命令 Behavior 自定义实现 5. MVVM案例 一般页面信息绑定 页面集合绑定 任意数据源绑定 自定义控件 6. MV…… 阅读全文

WPF学习笔记4:控件模版

2022-08-29 23:42:50

摘要:一、WPF控件的组成 1. 逻辑与呈现的分离 ​ 控件模板旨在成为展示详细信息的自包含单元,对外部用户和对象(包括 Style 对象)不可见。 操作控件模板内容的唯一方法是在当前控件模板中。 2. 模板修改:显示区域的内容重组 Button模板Template:渲染对象、属性值的关联、触发器 样式与模板 3. 基础控件如何显示的? 功能最强大,布局最灵活的容器 主要属性配置: ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column 使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel) 二、模板中的基础控件 1. 基础元素的呈现:DrawingContext DrawRect TextBlock Border OnRender 2. 控件模板案例解析 Label、GroupBox、CheckBox、RadioButton、ToggleButton TextBox/PasswordBox、TabControl/TabItem、TreeView/TreeViewItem、ListBox/ListBoxItem、ListView/ListViewItem、Menu/MenuItem ComboBox、ScrollViewer、ProgressBar、Slider Calendar/DatePicker、DataGrid 模板的添加与修改 默认模板:wpf\src\Microsoft.DotNet.Wpf\src\Themes 3. 控件模板案例解析 基本控件的使用 名称、基本作用表现、特征 常用属性:尺寸、定位、显示内容 常用事件:点击、输入 控件的特殊属性 Style:用来统一设置控件属性的对象 Resources:资源管理,存放可共用的数据(变量、样式、模板) Template:用来控制控件的呈现 目的: 三、属性与绑定 1. WPF的数据关系 绑定关系:数据绑定是应用呈现数据并与数据交互提供了一种简单而一致的方法,在应用 UI 与其显示的数据之间建立连接的过程。 2. 建…… 阅读全文

WPF学习笔记3:基本布局

2022-08-28 10:40:57

摘要:一、界面布局 1. 布局原则 不用显式的方式设定元素的尺寸 不使用屏幕坐标来指定位置 2. 常用布局控件与布局处理 Grid StackPanel DockPanel WrapPanel UniformGrid Canvas InkCanvas Border(装饰控件:背景色/边框 圆角 子对象也只能一个) 3. Grid 功能最强大,布局最灵活的容器 主要属性配置: ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column 使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel) 4. StackPanel 最简单的布局容器之一 主要属性配置:Orientation-调整排列方向、FlowDirection 使用场景:图文并显、工具栏 可以Grid代替 5. WrapPanel 唯一一个不能被Grid替代的布局控件,水平方向排列,过程中当前子项出界了,进行折行 主要属性配置:Orientation-调整排列方向 使用场景:桌面式图标排列、搜索历史关键词排列 6. DockPanel 通过设置Dock停靠进行布局 主要属性配置:LastChildFill、DockPanel.Dock 使用场景:应用的主窗口布局(标题栏、状态栏、工具栏、菜单栏) 7. UniformGrid 另一种行列风格布局,自动生成统一一致的行列 主要属性配置:Columns、Rows 指定的是当前区域均分多少行和列,不存在指定行高和列宽 使用场景:9宫格的功能区域、图表 8. Canvas 通过精确坐标定位放置子元素 主要属性配置:Canvas.Left、Top、Right、Bottom 使用场景:组态、组件封装(仪表) 9. InkCanvas 支持任意笔画输入的画布组件 主要属性配置: 使用场景:手写墨迹识别(不是手写图像识别):文字、图形 10. Border 最基础的装饰控件 主要属性配置: 使用场景: 二、界面布局处理案例分析 1. 可视化数字看板 使用控件总结:Border …… 阅读全文

WPF学习笔记2:3D绘图

2022-08-22 12:37:23

摘要:一、基本对象 1. WPF 3D WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中,该元素可以参与二维元素结构。 该图形系统将 Viewport3D 视为一个二维视觉元素,就像 WPF 中的许多其他元素一样。 Viewport3D 充当三维场景中的窗口(即视区)。 更准确地说,它是 3D 场景所投影到的图面。 2. 模型3D场景 3D视口 坐标系 点、线、面、三角顶点网格 材质 光源 相机 3. 3D对象模型结构 MeshGemetry3D Positions TraiangleIndices TextureCoordinates:如何对应? 4. 相机 OrthographicCamera:正交 PerspectiveCamera:透视 基本属性: Position:相机的空间坐标(X,Y,Z) LookDirection:观察方向,向量,相机观察口朝向 FieldOfView(透视相机属性) / Width(正交相机属性):视野范围(焦距),一个值 UpDirection:相机上方方向,控制相机观察口旋转 FarPlaneDistance:远景距离,大于这个距离的场景不渲染 NearPlaneDistance:近景距离,小于这个距离的场景不渲染 5. 3D对象模型材质 DiffuseMaterial:漫反射,反射场景光效果 EmissiveMaterial:自发光,类似于电灯 SpecularMaterial:全反射,可以映射场景 贴图(平面贴图、曲面贴图-地球) 背面材质 6. 3D对象模型光源 AmbientLight:环境光 DirectionalLight:平行光 PointLight:点光源 SpotLight:聚光灯 相关属性 Color:灯光颜色 Direction:光线方向(平行光、聚光灯) Position:光源坐标(点光源、聚光灯) Range:灯光范围(点光源) InnerConeAngle:内光柱照射角度(聚光灯) OuterConeAngle:外光柱照射角度(聚光灯) 7. 3D对象的变换 Transform3D:平移 xyz ScaleTransform3D:缩放 RotateTransform3D:旋转 M…… 阅读全文

WPF学习笔记1:基础控件

2022-08-21 22:56:30

摘要:一、基础控件汇总 控件类型 主要控件 按钮控件 Button、RepeatButton、RadioButton 数据显示控件 TextBlock、Label、Image、ItemsControl**、ListView、ListBox、**DataGrid、DocumentViwer 输入控件 TextBox、RichTextBox、CheckBox、ComboBox、DatePicker、PasswordBox、Slider、ProgressBar 菜单导航控件 MenuItem、ContextMenu、ToolBar、TreeView、TabControl、Expander 信息提示控件 Popup、Window、PrintDialog、ToolTip 布局控件 Grid**、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、InkCanvas、**Border 图形控件 Line、Rectangle、Ellipse、Polyline、Polygon、Path 其他控件 ScrollViwer、GroupBox、ViewBox 1. 常用属性 尺寸(宽高)、定位(Margin,HorizontalAlignment、VerticalAlignment)、颜色(Background、Foreground)、信息显示(Text、Content、ListViewItem、ListBoxItem、DataGridTextColumn…..) 鼠标事件、键盘事件 特别属性 RadioButton:GroupName 集合控件:AlternationCount ComboBox:SelectedItem、SelectedValue、SelectedValuePath、DisplayMemberPath、SelectedIndex DatePicker:SelectedDate、DisplayDateStart、DisplayDateEnd PasswordBox:Password(普通属性) Silder、ProgressBar:最小值、最大值、当前值 Popup:IsOpen、Placement、PlacementTarget、StaysOpen Window:无边…… 阅读全文

Kafka知识点总结

2022-04-30 20:53:37

摘要:Kafka最初是领英公司开发的消息流组件,后来捐献给了Apche。 一、拓扑结构 Broker 是 Kafka 集群中的核心服务器,你可以把它想象成一个邮局: 生产者(Producer)就像寄信人,把消息(信件)送到 Broker(邮局) 消费者(Consumer)就像收信人,从 Broker 取走自己的消息 一个 Kafka 集群通常由多个 Broker 组成,共同处理消息存储和转发Broker 的核心职责 1. 消息存储中心 持久化存储 :所有消息最终都会写入磁盘,而不仅仅是内存 分区管理 :每个 Broker 负责存储某些分区的数据 日志分段 :将大日志文件分割成多个段(segment),便于维护和清理 2. 消息路由中心 维护所有主题/分区的元数据信息 决定生产者应该把消息发送到哪个分区 协调消费者从哪个分区获取消息 3. 副本协调者 管理 Leader 副本和 Follower 副本的同步 监控副本的健康状态 在 Leader 失效时组织新的选举Broker的工作流程 Kafka的存储结构就像一本书的目录: 主题(Topic) :相当于书的标题,是消息的分类。比如用户注册、订单支付等。 分区(Partition) :相当于书的章节,每个主题可以被分成多个分区。分区使Kafka可以并行处理消息。 副本(Replica) :相当于书的复印本,每个分区可以有多个副本(通常3个)。分为Leader副本(主本)和Follower副本(副本)。 Kafka 会智能地将副本分布在不同 Broker 上: 同一个分区的不同副本不会放在同一个 Broker 尽量将分区的 Leader 均匀分布在所有 Broker 例如下图有 2个 Broker 和 1 个主题(分区数=3,副本数=2): Kafka的消息存储就像写日记: 消息以追加(append-only) 方式写入分区,不可修改 每个消息都有一个位移(offset) ,相当于日记的行号 消息按时间保留(默认7天),超过时间自动删除 分区日志被分成多个段(segment) 文件,便于管理 基于日志结构构建的消息引擎:消费消息时是读取日志文件,消息不会删除 二、消息流程 1. 消息写入流程 生产者连接到任意 Broker 获取元数据 Broker 返回主题分区信息和 Leader Brok…… 阅读全文

上一页 1 ... 3 4 5 6 7 ... 32 下一页