.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.rzrgm.cn/heyuquan/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
歡迎園友討論下自己的見解,及向我推薦更好的資料。
本文如對您有幫助,還請多幫 【推薦】 下此文。
謝謝?。。?nbsp; (*^_^*)
技術群:
(339322839廣西IT技術交流),歡迎你的加入

浙公網安備 33010602011771號