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
……
阅读全文
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方法,将委托……
阅读全文
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有哪些更好的地方
跨平台
对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起
处理请求的效率更高,能够处理更多请求
更多安装配置方法
二……
阅读全文
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 旋转鼠标滚……
阅读全文
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的数据关系
绑定关系:数……
阅读全文
2022-08-28 17:14:17
摘要:一、界面布局
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
支持任意笔画输入的画布组件
主要属性配置:
使用场景:手写墨迹识别(不是手写图像识别):文字、图形
……
阅读全文
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……
阅读全文
2022-08-21 19:58:54
摘要:一、基础控件汇总
| 控件类型 | 主要控件 |
| ------------ | ------------------------------------------------------------ |
| 按钮控件 | 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
集合控……
阅读全文
2022-04-02 21:34:55
摘要:一、MongoDB核心概念
1. 定位与优势
目标:处理海量数据(名称源自humongous),支持高可用、水平扩展。
数据模型:
JSON文档结构:天然贴合面向对象思想,支持嵌套对象和数组。
动态模式:使用BSON(JSON的二进制扩展)存储,支持日期、二进制等扩展类型。
核心优势:
易用性:类JSON语法降低学习成本。
高性能:内存映射引擎、写优化设计。
高可靠性:副本集自动故障转移。
高扩展性:原生分布式架构(分片集群)。
2. SQL vs MongoDB概念对比
关键差异:MongoDB属于半结构化数据模型,无固定表结构,不支持事务级JOIN。
二、基础操作实战
1. 集合与文档操作
// 创建/切换数据库
use sample
// 插入文档
db.persons.insertOne({ name: 张三, age: 22 })
db.persons.insertMany([...])
// 查询文档
db.movies.find( { year : 1975 } ) //单条件查询
db.movies.find( { year : 1989, title : Batman } ) //多条件and查询
db.movies.find( { $and : [ {title : Batman}, { category : action }] } ) // and的另一种形式
db.movies.find( { $or: [{year : 1989}, {title : Batman}] } ) //多条件or查询
db.movies.find( { title : /^B/} ) //按正则表达式查找
// 更新与删除
db.persons.updateMany({ age: 22 }, { $set: { status: active }})
db.persons.deleteMany({ age: { $lt: 18 }})
db.runCommand({ drop: persons }) // 删除集合
2. 查询条件对照表
| SQL | MQL |
| ----……
阅读全文
2022-03-26 14:47:44
摘要:前提条件
在开始之前,请确保您已经准备好了 redis-cluster 文件夹,内部包含 docker-compose.yml 和 redis.conf 文件。
创建哨兵配置文件 (sentinel.conf)
在 redis-cluster 文件夹中,新建一个名为 sentinel.conf 的文件。
将以下配置内容复制并粘贴到 sentinel.conf 文件中。
# 哨兵监控的主节点信息
# 格式: sentinel monitor master-name ip port quorum
# name: 自定义的集群名称,例如 myredis
# ip: 主节点的IP、主机名、容器名
# port: 主节点的端口 6379
# quorum: 法定人数。表示至少需要多少个哨兵同意,才能判定主节点下线。3个哨兵建议设置为2
sentinel monitor myredis 6379 2
# 主节点连接密码。这必须与您在 redis.conf 中设置的 requirepass 和 masterauth 密码一致
# 格式: sentinel auth-pass master-name password
sentinel auth-pass myredis 123456
# 判定主节点下线的时长(毫秒)
# 如果主节点在30秒内没有响应,哨兵就认为它主观下线
# 格式: sentinel down-after-milliseconds master-name milliseconds
sentinel down-after-milliseconds myredis 30000
# 故障转移超时时间(毫秒)
# 当故障转移开始后,若超过此时间还未完成,则视为失败
# 格式: sentinel failover-timeout master-name milliseconds
sentinel failover-timeout myredis 180000
# 执行故障转移时,最多可以有多少个从节点同时对新的主节点进行同步
# 设置为 1 表示一次只有一个从节点进行同步,避免对新主节点造成过大压力
# 格式: sentinel parallel-syncs master-name num-slaves……
阅读全文