.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)
EF Core性能优化技巧 (实例池、拆分查询、批量更新、批量删除、非跟踪查询等)
数据库相关其他
性能优化
单列索引和多列索引
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技术交流),欢迎你的加入