.NET Core 资料精选:进阶篇
前一篇博文《.NET Core 资料精选:入门篇》大家学的可还开心?这是本系列的第二篇文章:进阶篇,喜欢的园友速度学起来吧。
对于还在使用传统.NET Framework 框架的园友,可以通过《.NET项目迁移到.NET Core操作指南》把需要新生力量的旧项目速度迁移到.NET Core 中
本系列文章,主要分享一些.NET Core比较优秀的社区资料和微软官方资料。我进行了知识点归类,让大家可以更清晰的学习.NET Core。
首先感谢资料原作者的贡献。
介绍.NET历史、开源之路、基础、路由、依赖注入DI、HttpContext、cookie|session、HttpClient、gRPC、单元测试、发布部署等等。
介绍.NET工程化、AOP、异常处理、缓存、日志、响应优化、上传下载、健康检查、后台任务、认证和授权、安全性(Https、CORS、CSRF)、EF Core 等等
介绍.NET跨平台的包袱与演变、.NET运行机制、性能分析方案;架构相关知识(设计原则、设计模式、DDD、微服务、中台等);.NET相关的微服务开发框架、微服务技术、云原生(docker、k8s)等
推荐资料:.NET开源github资源汇总(awesome-dotnet-core)
这是第二篇,知识点如图:
.NET 工程化
#、StyleCop编码规范
netcore将StyleCop.Analyzers自定义规则应用到整个解决方案
#、Nuget包
在 Vistual Studio 中管理项目、解决方案的nuget包
创建并发布Nuget包
使用 Visual Studio 创建和发布 NuGet 包
使用 Visual Studio 创建包并通过浏览器上传发布(使用简单)
搭建本地Nuget
使用NuGet.Server 搭建本地Nuget(为什么要规范使用nuget包,如何清除本地包缓存)
#、Swagger Api文档
Swagger+AutoRest 生成web api客户端(.Net)
Swashbuckle方式
.NET Core 集成Swagger文档与自定义Swagger UI、API分组
Asp.Net Core 使用Swagger生成API文档并添加文档描述、响应类型描述
.NET Core swagger扩展配置(请求示例、约束请求/响应媒体类型、指示API的预期输出内容、预期状态码)
Asp.Net Core 给API的Model生成说明文档、隐藏某些API
Swagger UI 将枚举数字显示位字符串(也可扩展为显示枚举的中文描述信息)
NSwag方式
Asp.Net Core 使用NSwag生成Swagger Api文档
借助 NSwagStudio 工具可为包含 Swagger 的第三方 API,生成API客户端代理代码
AOP面向切面编程
AOP(Aspect-Oriented Programming)是一种将函数的辅助性功能与业务逻辑相分离的编程范式(programming paradigm),其目的是将横切关注点(cross-cutting concerns)分离出来,使得程序具有更高的模块化特性。
AOP体现原则:单一职责原则 和 开放封闭原则
在ASP.NET Core中可使用三种方式实现AOP:中间件Middleware、过滤器Filter、代码织入(静态织入和动态代理)
ASP.NET Core使用功能开关提高应用程序灵活性(无需重新启动应用程序或部署新代码)
#、中间件Middleware(管道级)
中间件就是嵌入到应用管道中用于处理请求和响应的一段代码,ASP.NET Core 中使用了大量的中间件。eg:全局异常、路由、响应缓存、响应压缩、身份认证、CORS、日志记录等等
ASP.NET Core Middleware 的实现(Conventional Middleware 和IMiddleware)
ASP.NET Core Middleware 的实现(Run,Map,Use,内置中间件)
1 public void Configure(IApplicationBuilder app) 2 { 3 app.Use(async (context, next) => 4 { 5 Console.WriteLine("A (before)"); 6 await next(); 7 Console.WriteLine("A (after)"); 8 }); 9 app.UseWhen( 10 context => context.Request.Path.StartsWithSegments(new PathString("/foo")), 11 a => a.Use(async (context, next) => 12 { 13 Console.WriteLine("B (before)"); 14 await next(); 15 Console.WriteLine("B (after)"); 16 })); 17 app.Run(async context => 18 { 19 Console.WriteLine("C"); 20 await context.Response.WriteAsync("Hello world"); 21 }); 22 } 23
请求不是以 " /foo " 开头 |
请求是以 " /foo " 开头 |
A (before) |
A (before) |
C |
B (before) |
A (after) |
C |
B (after) |
|
A (after) |
#、过滤器Filter(action级)
ASP.NET Core MVC Filter的定义、注册和各种Filter执行顺序
#、代码织入(对象的拦截器)
l 编译时静态织入
特点:[编译型]性能高,缺点是缺乏灵活性
实现思想:给语言的编译器做扩展,使得在编译程序的时候编译器将相应的“切面”代码织入到业务代码的指定连接点,输出整合的结果。
l 运行时动态织入(动态代理)
特点:[运行时动态代理]灵活性高,性能相对“静态织入”低
实现方式:将扩展添加到运行虚拟机而不是编译器。切面代码和业务代码分别独立编译,而在运行时由虚拟机在必要时进行织入。
.Net AOP代码织入实现类型及原理(静态、动态、优缺点)
.Net AOP代码织入之《拦截方法》(包含案例:数据事物、多线程)
演示了清晰的业务代码,因为非功能性需求(eg:logging,防御性编程,事务,重试,和异常处理等)导致代码变得冗长、难懂、不易维护。通过使用AOP来让业务代码重新清晰化
异常处理
ASP.NET Core 应用的错误处理[1]:三种呈现错误页面的方式
使用UseStatusCodePages 根据Status选择处理方式(跳转页面)
ASP.NET Core 自定义ErrorHandlingMiddleware 全局异常捕获
缓存
.NET Core MemoryCache 缓存过期策略(绝对、滑动、依赖、过期回调)
ASP.NET Core 使用分布式缓存(redis、sqlserver)
ASP.NET Core 使用RedLock.net 实现分布式锁
日志
[github]ASP.NET Core Microsoft.Extensions.Logging 默认log组件
ASP.NET Core 中使用Serilog 记录日志 (代码配置、配置文件配置)
分布式日志
.NET Core中使用Exceptionless分布式日志框架
Exceptionless 5.0.0 本地Docker快速部署介绍
.NET Core 快速搭建Docker-ELK分布式日志中心
elasticsearch
Asp.Net Core 项目中使用 Serilog 输出日志到 Elasticsearch
ASP.NET Core使用Elasticsearch记录NLog日志
Docker安装Elasticsearch-Head插件(可视化查询界面) (如何使用)
asp.net core 自定义基于 HttpContext 的 Serilog Enricher
日志摄取器
为什么我们需要Logstash,Fluentd等日志摄取器?
ASP.NET Core容器化应用无侵入日志收集方案(nlog+EFK)
seq
响应优化
在ASP.NET Core 中的响应压缩 (br,gzip,deflate)
ASP.NET Core 中使用ResponseCache 响应缓存
上传下载
ASP.NET Core 中的文件上传(IFormFile)、流式处理上传大文件
.NET Core Web API 基于tus协议实现断点续传(上传)
健康检查
检查应用的健康状况(定期检查,细粒度检查某些接口的状态,定制返回报文,定制返回状态码等)
ASP.NET Core 中的运行状况检查(IHealthCheck)
[github]ASP.NET Core HealthChecks(健康检查,异常webhooks通知)
使用案例:
使用ASP.NET Core实现Docker的HealthCheck指令
Kubernetes liveness and readiness probes using HealthChecks
其他特性
#、对象池
如何在 C# 中使用 ArrayPool 和 MemoryPool
#、WebHooks
WebHooks with ASP.NET Core – DropBox and GitHub
后台任务
基础知识
ASP.NET Core 中使用托管服务实现后台任务(后台任务、作用域任务、队列任务)
.NET Core 创建跨平台后台服务(windows、linux)
.NET Worker Service 如何优雅退出(IHostApplicationLifetime )
.NET 使用自带 DI 批量注入服务(Service)和 后台服务(BackgroundService)
特点:不需要Windows服务或单独的进程
ASP.NET Core 中使用Hangfire任务管理(含Dashboard)
Hangfire 授权、自定义路由、只读Dashboard、多数据库源、设置主应用
ASP.NET Core 中使用Hangfire.Redis.StackExchange存储
ASP.NET Core 中Hangfire.Cronos 结合BackgroundService 实现任务调度
使用ASP.NET Core和Hangfire实现HTTP异步化方案
巧用
使用 Hangfire 和 AsyncFlow 实现异步轮询 Web API 的功能
Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)
ASP.NET Core2.2+Quartz.Net 实现web定时任务
Quartz.NET 配置文件详解(quartz.config 和quartz_jobs.xml)
----quartz.config可以合并到App.config和Web.config中
quartz.net 3.x版本如何通过xml文件进行Job配置
配置Quartz.NET Cluster以及远程管理(CrystalQuartz)
Quartz.NET 可视化Job管理(CrystalQuartz)
认证和授权
授权认证登录之 Cookie、Session、Token、JWT 详解
理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)
简单说明: Claim就是证件中的信息;ClaimsIdentity就是证件(eg:现实生活中的身份证);ClaimsPrincipal就是持有证件的人
#、ASP.NET Core Identity身份认证
命名空间:Microsoft.AspNetCore.Identity
创建完整的ASP.NET Core Identity基架(多图)
ASP.NET Core Identity配置(声明类型、锁定策略、密码策略、登录策略等等)
双因素认证
ASP.NET Core Identity身份验证支持OAuth2第三方验证提供程序
ASP.NET Core Idendity自定义存储提供程序(Azure表存储、Dapper)
#、基于Cookie的身份认证
命名空间:Microsoft.AspNetCore.Authentication.Cookies
ASP.NET Core Cookie身份验证支持OAuth2第三方验证提供程序
#、授权
命名空间:Microsoft.AspNetCore.Authorization
ASP.NET Core web api基于JWT自定义策略授权
ASP.NET Core Authentication and Authorization
ASP.NET Core JWT认证、更改Token来源、更改Token验证方式
#、IdentityServer4 认证授权
IdentityServer4 是基于 ASP.NET Core 实现的认证和授权框架,是对 OpenID Connect 和 OAuth 2.0 协议的实现。
快速理解 IdentityServer4 中的认证 & 授权
[晓晨Master]IdentityServer4 中文文档与实战
.Net Core IdentityServer4:使用.Net Framework客户端对接
(1).Net Framework 客户端Owin方式对接ids4
(2).Net Framework 客户端User和Role的解析
安全性
在.NET Core中使用 MachineKey (NuGet包:AspNetTicketBridge)
ASP.NET Core 优雅的在开发环境保存机密(User Secrets)--secrets.json
#、HTTPS
证书
免费申请HTTPS通配符证书(Let's Encrypt证书)----(windows桌面工具>>)
使用脚本持续自动从Letsencrypt更新CA证书---免费的Letsencrypt证书一般有效期为三个月
aspnet core 本地localhost调试证书安装或过期,则执行命令:(cmd执行 certlm.msc 命令,进入证书管理)
dotnet dev-certs https --clean
dotnet dev-certs https --trust
服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响
.NET Core 强制使用https,把所有的HTTP请求转换为HTTPS
HSTS(HTTP严格传输安全)
使用HTTPS重定向仍然存在一下较小的安全风险,因为用户可以在重定向到安全HTTPS连接之前使用HTTP发出初始请求。为了解决这个问题,HTTP严格传输安全性(HSTS)协议在响应中添加了一个标头,指示在向Web端点发送请求时仅应使用HTTPS。一旦接收到HSTS标头,即使用户指定了HTTP URL,支持HSTS协议的客户端也将始终使用HTTPS向应用程序发送请求。
ASP.NET Core 3.1中HTTPS的配置(环境变量中指定证书)
HTTP Strict Transport Security (HSTS) in ASP.NET Core
#、Data Protection 机制 (.NET Core 数据保护)
ASP.NET Core 数据保护(Data Protection)【上】
ASP.NET Core 数据保护(Data Protection)【中】
ASP.NET Core 数据保护(Data Protection 集群场景)【下】
#、CORS
跨域资源的共享(CORS)N种用法(全局指定、路由节点Action上指定)
#、CSRF
ASP.NET Core 防止跨站点请求伪造(XSRF/CSRF) 攻击
ASP.NET Core WebAPI 中防御跨站请求伪造攻击(CSRF)
EF Core
Linq
如何优化 .NET Core 中的 lambda 查询表达式 ?
SQL执行记录
将EF Core生成的SQL语句显示在控制台中(10楼评论)
SQL Server Profiler的简单过滤使用,方便查找和发现SQL执行的效率和语句问题
使用 SQL Server Profiler 查看指定ApplicationName产生的sql语句
EF Core 5提供的ToQueryString()查看Linq生成的SQL语句
EF Core DbFirst:从数据库生成实体类(反向工程)
Code First
EF Core CodeFirst:从实体创建数据库--示例
EF Core CodeFirst:从实体创建数据库--命令和语法
EFCore数据库迁移命令(使用Script-Migration命令生成迁移sql语句--注意:不含from,含to)
EF Core 小技巧:迁移已经应用到数据库,如何进行迁移回退操作?
EFCore 实现 CodeFirst 通过模型生成数据库表时自动携带模型及字段注释信息
迁移疑问
如何理解 Code-First migration, up/down方法?
全局唯一Id、有序GUID
UUID是由128位二进制数组成,通常表示为32个十六进制数,中间用连字符连接。
模型配置
EF Core 创建组合主键(HasKey(c => new { a, b }))
级联删除
需要注意:级联删除是数据库的特性。如使用ABP Vnext中的软删除,那么只是将记录的IsDeleted设置为true,并不是真正的删除记录,所以没有级联删除子表的效果。。。同时,子表的IsDeleted也并没有设置为true,需要代码调用软删除子表(所以这边应该走聚合根的删除,达到整体删除/软删除的目的)。。。(考察版本 ABP Vnext 4.3.0)
EF 值转换器(ValueConverter)
关系数据库建模
EF Core 生成跟踪列(eg:CreatedAt,CreatedBy等列)
枚举映射
方案1:EF 枚举类型映射数据库 (数据库中存的是数值,不方便查看)
方案2:枚举字段转为字符串字段存储在db中,方便查看
使用导航属性,解决父子表在同一个事务保存的问题 (主表ID不需要赋值)
并发
EF Core 并发检查(单字段 ConcurrencyCheck 和 行标记 Timestamp )
数据查询
EF 中 IEnumerable,IQueryable ,Include 的用法
EF Core 关联数据加载策略(预先加载、显示加载、延迟加载) -- 预先加载中关于多级关联的使用ThenInclude。Blog -> Posts -> (Author 和 Tags)案例
深入了解 EFCore2.1 中加入的延迟加载 (EF 6.x默认启用了延迟加载,EFCore需要引入Proxies包显示启用)
EF Include中进行OrderBy (例子:query.Include(o => o.Components.OrderBy(s => s.Order).ThenByDescending(s => s.CreationTime)))
EF Core 跟踪与非跟踪查询(AsNoTracking)
数据过滤
如何在 Entity Framework 中计算时间差 ?(EF.Functions.DateDiffDay)
日志
EF Core 6 TagWithCallSite和自定义查询标记
大数据量相关
批量数据操作
EF Core 原生支持的批量插入操作(sp_executesql)
EF CORE 7 中的新功能:使用 ExecuteDelete 和 ExecuteUpdate 进行批量操作
Z.EntityFramework
[收费]使用Entity Framework Extensions 实现批量增、删、改 -- Z.EntityFramework.Extensions.EFCore(截止2021/7/26 下载数:5,556,261)
[免费]Entity Framework Extensions 提供功能缩减版:EntityFramework-Plus -- Z.EntityFramework.Plus.EFCore(截止2021/7/26 下载数:5,842,130)
[免费]EFCore.BulkExtensions -- (截止2021/7/26 下载数:5,459,140)
EntityFramework Core 5.0 VS SQLBulkCopy
分库分表、读写分离
.Net Core导入千万级数据至Mysql (MySqlBulkLoader)
如何一步步让公司的MySQL支撑亿级流量(读写分离、主从复制、从库延迟问题、代理中间件)
EFCore数据加密存储
EntityFrameworkCore数据加密存储解决方案(github:EntityFrameworkCore.DataEncryption)
EfCore 相关其他
EF Core事务提交,分布式事务(EF Core 2.1之后移除了分布式事务的支持)
EF Core 二级缓存(EFCore.SecondLevelCacheInterceptor)
如何优雅地处理 EF Core 异常(EntityFramework.Exceptions)
数据库相关其他
性能优化
单列索引和多列索引
SQL Server、MySQL主从搭建,EF Core读写分离代码实现
mysql limit 查询优化对排序影响的问题(mysql 5.6之后的版本)
Mysql group by中子查询order by排序失效问题分析
看完”入门”和”进阶”两篇文章,对.NET Core的常用特性基本是掌握了的。接下来的”架构”篇,会介绍性能、原理、微服务架构、Docker、DDD等知识。
==============================================================================
over,谢谢查阅,觉得文章对你有收获,请多帮推荐。欢迎向我提供更好的资料信息。
作者:滴答的雨
出处:http://www.cnblogs.com/heyuquan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
欢迎园友讨论下自己的见解,及向我推荐更好的资料。
本文如对您有帮助,还请多帮 【推荐】 下此文。
谢谢!!! (*^_^*)
技术群:(339322839广西IT技术交流),欢迎你的加入