本書以ASP.NET Core項目為例,系統(tǒng)地介紹了.NET6的各個重要知識點。書中內(nèi)容融合了作者多年實踐的豐富經(jīng)驗,講解深入淺出,全面且細(xì)致。 本書共分為四篇25章。第一篇(第1~3章)是.NET 6基礎(chǔ)篇,主要介紹.NET平臺、C#語言和Visual Studio開發(fā)環(huán)境的常用功能和特性。第二篇(第4~10章)是Entity Framework Core篇,主要介紹Entity Framework Core的各種功能和使用方法,包括快速入門、實體模型、實體模型的關(guān)系、管理實體模型和數(shù)據(jù)庫架構(gòu)、管理數(shù)據(jù)、查詢數(shù)據(jù)、Entity Framework Core共享功能等內(nèi)容。第三篇(第11~24章)是ASP.NET Core篇,主要介紹ASP.NET Core框架的基礎(chǔ)知識、身份認(rèn)證、授權(quán)、MVC、Razor Pages、Blazor、Razor類庫、Web API、遠程過程調(diào)用、實時通信、應(yīng)用安全、高級功能等內(nèi)容。第四篇(第25章)是實戰(zhàn)演練篇,用一個功能完整的電子商城項目來串聯(lián)前面三篇介紹的大部分功能,幫助讀者跨越從基礎(chǔ)知識的學(xué)習(xí)到實際應(yīng)用的門檻。 本書以.NET 6的入門學(xué)習(xí)者和有其他C系語言的使用經(jīng)驗并有意了解ASP.NET Core的人為主要目標(biāo)讀者,同時適合被中高級開發(fā)者當(dāng)作功能模塊速查和學(xué)習(xí)高級功能的手冊,還可以作為高等院校相關(guān)專業(yè)的教學(xué)用書和培訓(xùn)學(xué)校的教材。
融合.NET基礎(chǔ)知識、核心技術(shù)與項目實現(xiàn),除使用C#代碼外,還結(jié)合C 、Java代碼進行對比演示,熟悉其中任何一種語言的讀者都可以輕松上手
涉及眾多現(xiàn)代Web流行技術(shù),包括交互式Web UI框架Blazor、數(shù)據(jù)訪問技術(shù)GraphQL、.NET互操作代碼的編寫等
.NET作為新近崛起的開發(fā)框架,它繼承了前輩.NET Framework的大量優(yōu)點,并針對新時代的需求進行了大量改進。擁抱開源跨平臺的.NET得到大量優(yōu)秀開發(fā)者的喜愛和支持,發(fā)展勢頭迅猛。歷經(jīng)6代更新,目前的.NET也日趨穩(wěn)定,基礎(chǔ)框架的大量知識在可預(yù)見的將來不會發(fā)生大幅變動,學(xué)習(xí)曲線會逐步平穩(wěn)。對于將來的新版本,用戶基本可以只用補充了解新內(nèi)容而不必?fù)?dān)心已有知識被顛覆或廢棄。
ASP.NET Core是一個專為Web開發(fā)而準(zhǔn)備的基礎(chǔ)框架,作為其基礎(chǔ)的.NET框架勢必是不能無視的,更何況ASP.NET Core中使用的大量功能其實是.NET的通用功能,只不過因其在ASP.NET Core中非常有用而被默認(rèn)集成。為了避免讀者把這些默認(rèn)集成的功能誤以為是ASP.NET Core的專用功能,筆者在書中的文字段落和示例代碼中給予了明確的提示,這也是為本書取名的一大考慮。雖然本書以ASP.NET Core為例進行深入解析,但其中的大量知識其實通用于整個.NET,故書名取為.NET入門而不是ASP.NET Core入門。以ASP.NET Core為例進行深入解析則是因為現(xiàn)在是大Web時代,ASP.NET Core最具有通用性和代表性,能覆蓋最廣的場景。
筆者自大學(xué)時期接觸軟件開發(fā)以來,讀到的入門學(xué)習(xí)的書多為項目實例與知識講解交織在一起的一類書。筆者在閱讀時頗為苦惱,每次想要專門查閱某個細(xì)節(jié)時總是很難快速定位,又或者知識點被分散到多個位置,要來回翻看。因此在本書的編寫中筆者采用了分離基礎(chǔ)知識和綜合練習(xí)的形式,并在綜合練習(xí)中展示相關(guān)知識點的引用。希望廣大讀者由此能得到更好的閱讀體驗。
在現(xiàn)代Web技術(shù)中,漸進式Web應(yīng)用和Web Assembly無疑是最耀眼的新星,甚至取代了大量曾經(jīng)的本地桌面應(yīng)用。Blazor作為這兩項技術(shù)的融合和工程化的代表卻沒有在中文書籍中獲得應(yīng)有的篇幅予以介紹,因此本書將Blazor作為和MVC、Razor Pages等頁面渲染框架同等重要的技術(shù)來介紹,并在第四篇實戰(zhàn)演練中作為一個關(guān)鍵組成部分予以應(yīng)用。
現(xiàn)代Web應(yīng)用的復(fù)雜性日趨提升,普通的Web API在面對這種復(fù)雜性時頗為艱難。為此新一代數(shù)據(jù)訪問技術(shù)GraphQL進入廣大開發(fā)者的視野。但較為可惜的是,這項技術(shù)似乎被許多人誤解并認(rèn)為難以應(yīng)用到項目中。這固然有GraphQL本身的復(fù)雜性導(dǎo)致的部分原因,但是開發(fā)者的錯誤認(rèn)知導(dǎo)致的誤解是更為主要的原因。為了讓.NET開發(fā)者能直接體會到GraphQL的廣泛適用性,本書選擇了在Blazor應(yīng)用中使用該技術(shù)提供數(shù)據(jù)支持。
隨著物聯(lián)網(wǎng)的發(fā)展,應(yīng)用軟件需要更緊密地和底層硬件結(jié)合,這導(dǎo)致了軟件開發(fā)語言選擇的困難。想要順利接入硬件勢必要使用能訪問硬件的底層語言,例如C語言,但是底層語言在開發(fā)上層應(yīng)用時卻非常麻煩,本就復(fù)雜的業(yè)務(wù)和底層語言的各種細(xì)節(jié)攪在一起實在是對人的一種折磨。這時為上層應(yīng)用和底層硬件分別選用不同的語言和框架似乎是不錯的選擇,但偏偏高級語言和底層語言的交互又成了個大麻煩。此時C#和.NET便成為了廣大開發(fā)者的得力助手。.NET從一開始就非常重視和本機代碼交互的功能,但是無論如何,互操作代碼的編寫還是有無法避免的內(nèi)在復(fù)雜性,為此筆者專門在書中介紹了一些簡化互操作開發(fā)的方法和模塊。
對于希望入門.NET 6以及有其他的C系語言的使用經(jīng)驗的讀者,本書系統(tǒng)地梳理了C#的發(fā)展歷程,并以此為線索介紹C#的各種功能和語言特性,還與常用的C系語言進行對比,方便讀者根據(jù)需要選用合適的方法實現(xiàn)功能、互相移植其他語言和C#的代碼。對于中高級開發(fā)者,本書介紹了一些優(yōu)秀的第三方模塊,希望能為開發(fā)者提供一些參考。本書對除第四篇實戰(zhàn)演練之外的其他內(nèi)容進行了歸類整理,并根據(jù)內(nèi)容之間的依賴關(guān)系調(diào)整了先后順序,由此可以衍生出三種閱讀方式:對于初學(xué)者,推薦按順序閱讀,這樣可以由淺入深地逐步學(xué)習(xí),并確保不會在閱讀時遇到和主要內(nèi)容無關(guān)的未知知識點;對于中高級開發(fā)者,可以直接閱讀實戰(zhàn)演練篇并跟著練習(xí),然后在練習(xí)中有針對性地閱讀不熟悉的知識點;對于二次閱讀的讀者,本書則可以當(dāng)作速查手冊使用,本書的內(nèi)容歸類和目錄都針對速查進行了專門的設(shè)計和編排。
本書配套的PPT和源代碼需要使用微信掃描下面的二維碼獲取,可按掃描后的頁面提示填寫你的郵箱,把下載鏈接轉(zhuǎn)發(fā)到郵箱中下載。如果發(fā)現(xiàn)問題或有疑問,請用電子郵件聯(lián)系booksaga@126.com,郵件主題為C#與.NET 6開發(fā)從入門到實踐。
PPT 源代碼
本書是筆者編寫的第一本書,它傾注了筆者的大量心血和多年經(jīng)驗積累的心得體會,但是由于筆者的文字功底、時間和篇幅等問題,不可避免地會出現(xiàn)疏漏。歡迎廣大讀者提出建議,筆者愿積極與讀者交流,希望本書能發(fā)揮出更大的價值,不負(fù)筆者付出的努力和時間。
編者
2023年1月
敖瑞,網(wǎng)絡(luò)工程專業(yè),中級軟件設(shè)計師,從業(yè)5年,資深軟件工程師,主要從事系統(tǒng)開發(fā),精通C# .NET開發(fā),同時熟悉JavaScript和Web前端開發(fā)。在國內(nèi)開發(fā)者論壇分享學(xué)習(xí)思考心得,參與開源社區(qū)項目的完善。
第一篇 .NET 6基礎(chǔ)
第1章 構(gòu)建.NET 6開發(fā)環(huán)境 3
1.1 .NET、.NET Core、.NET Standard與.NET Framework 3
1.2 ASP.NET Core與ASP.NET 4
1.3 其他.NET應(yīng)用模型 4
1.4 Visual Studio簡介 4
1.5 安裝Visual Studio 5
1.6 小結(jié) 7
第2章 Visual Studio的解決方案和項目 8
2.1 解決方案和項目簡介 8
2.2 創(chuàng)建解決方案和項目 8
2.2.1 創(chuàng)建方法 8
2.2.2 操作演示和說明 9
2.3 引用其他項目和第三方程序包 12
2.3.1 引用其他項目 12
2.3.2 引用第三方程序包 13
2.3.3 卸載程序包和項目引用 16
2.4 .NET主要項目類型 16
2.5 解決方案和項目文件解析 16
2.5.1 解決方案文件 16
2.5.2 項目文件 17
2.6 小結(jié) 18
第3章 C#發(fā)展史 19
3.1 簡介 19
3.2 C# 1.0 19
3.2.1 類、結(jié)構(gòu)體和聯(lián)合體 20
3.2.2 接口 22
3.2.3 屬性 23
3.2.4 委托 26
3.2.5 事件 28
3.2.6 運算符和表達式 29
3.2.7 語句 31
3.2.8 命名空間 31
3.2.9 特性 32
3.2.10 unsafe上下文 33
3.3 C# 2.0 35
3.3.1 泛型 35
3.3.2 協(xié)變和逆變 38
3.3.3 委托的方法組轉(zhuǎn)換 39
3.3.4 分部類型 39
3.3.5 匿名方法 40
3.3.6 可為null的結(jié)構(gòu)體 40
3.3.7 枚舉器 41
3.3.8 靜態(tài)類 41
3.3.9 獨立的屬性訪問器保護級別 43
3.3.10 委托類型推斷 43
3.4 C# 3.0 44
3.4.1 自動實現(xiàn)屬性 44
3.4.2 分部方法 44
3.4.3 對象初始化器 45
3.4.4 隱式類型的本地變量 45
3.4.5 匿名類型 46
3.4.6 Lambda表達式 46
3.4.7 表達式樹 47
3.4.8 擴展方法 47
3.4.9 LINQ(Language-Integrated Query) 48
3.5 C# 4.0 50
3.5.1 動態(tài)綁定 50
3.5.2 可選參數(shù)和命名參數(shù) 50
3.5.3 嵌入的互操作類型 51
3.5.4 泛型的協(xié)變和逆變 51
3.6 C# 5.0 52
3.6.1 調(diào)用方信息特性 52
3.6.2 異步成員 52
3.7 C# 6.0 53
3.7.1 靜態(tài)導(dǎo)入 53
3.7.2 異常篩選器 54
3.7.3 表達式體成員 54
3.7.4 自動屬性初始化表達式 55
3.7.5 索引初始化器 55
3.7.6 null引用傳播運算符 55
3.7.7 字符串內(nèi)插 56
3.7.8 nameof運算符 57
3.7.9 catch和finally塊中的await 57
3.7.10 Roslyn 57
3.8 C# 7.0 60
3.8.1 out變量 60
3.8.2 元組、解構(gòu)和棄元 60
3.8.3 模式匹配 61
3.8.4 本地函數(shù) 62
3.8.5 表達式體成員增強 63
3.8.6 二進制文本和數(shù)字分隔符 63
3.8.7 throw表達式 63
3.8.8 ref局部變量和返回值 63
3.9 C# 7.1 64
3.9.1 異步主函數(shù) 64
3.9.2 default表達式 64
3.9.3 元組元素名稱推斷 65
3.9.4 泛型類型參數(shù)的模式匹配 65
3.10 C# 7.2 65
3.10.1 非尾隨命名參數(shù) 65
3.10.2 數(shù)值文本的前導(dǎo)下畫線 66
3.10.3 private protected訪問修飾符 66
3.10.4 針對參數(shù)的in修飾符 66
3.10.5 針對方法返回值的ref readonly修飾符 67
3.10.6 readonly struct結(jié)構(gòu)體 67
3.10.7 ref struct結(jié)構(gòu)體 68
3.10.8 條件ref表達式 68
3.11 C# 7.3 68
3.11.1 非托管類型和泛型約束增強 68
3.11.2 無須固定即可訪問固定的字段 69
3.11.3 可以重新分配ref局部變量 69
3.11.4 可以使用stackalloc數(shù)組上的初始值設(shè)定項 69
3.11.5 更多類型支持fixed語句 70
3.11.6 元組支持==和!=操作符 70
3.11.7 支持為自動實現(xiàn)屬性的后臺字段添加特性 70
3.11.8 增強包含in修飾符的方法重載的選擇策略 70
3.11.9 擴展out變量的適用范圍 71
3.11.10 改進方法重載的選擇策略 71
3.12 C# 8.0 71
3.12.1 默認(rèn)接口方法 71
3.12.2 模式匹配增強 72
3.12.3 結(jié)構(gòu)體的readonly成員 75
3.12.4 using聲明 75
3.12.5 靜態(tài)本地函數(shù) 76
3.12.6 可釋放的ref struct 76
3.12.7 可為null的引用類型 76
3.12.8 異步可釋放 77
3.12.9 異步枚舉器 78
3.12.10 索引和范圍 79
3.12.11 null合并賦值 80
3.12.12 非托管泛型結(jié)構(gòu)體 80
3.12.13 嵌套表達式中的stackalloc 80
3.12.14 內(nèi)插字符串和逐字字符串 80
3.13 C# 9.0 81
3.13.1 init屬性訪問器 81
3.13.2 記錄 81
3.13.3 頂級程序 83
3.13.4 模式匹配增強 84
3.14 本機大小的整數(shù) 85
3.14.1 函數(shù)指針 85
3.14.2 禁止本地初始化特性 86
3.14.3 靜態(tài)匿名函數(shù) 87
3.14.4 類型推導(dǎo)的new表達式 87
3.14.5 類型推導(dǎo)的條件表達式 88
3.14.6 協(xié)變返回類型 88
3.14.7 foreach循環(huán)支持GetEnumerator擴展方法 88
3.14.8 參數(shù)棄元 89
3.14.9 本地函數(shù)支持特性 89
3.14.10 模塊初始化器 90
3.14.11 分部方法增強 90
3.14.12 源生成器 91
3.15 C# 10.0 91
3.15.1 結(jié)構(gòu)體記錄 91
3.15.2 結(jié)構(gòu)體允許自定義公共無參構(gòu)造函數(shù) 91
3.15.3 強化的with表達式 92
3.15.4 記錄允許密封ToString方法 92
3.15.5 全局using 92
3.15.6 文件范圍的命名空間 93
3.15.7 常量內(nèi)插字符串 93
3.15.8 內(nèi)插字符串處理程序 93
3.15.9 Lambda表達式增強 93
3.15.10 CallerArgumentExpression診斷特性 94
3.15.11 解構(gòu)支持混合使用已有變量和內(nèi)聯(lián)聲明變量 94
3.15.12 增強的屬性模式 94
3.15.13 方法上的自定義異步狀態(tài)機特性 95
3.16 小結(jié) 95
第二篇 Entity Framework Core
第4章 快速入門 99
4.1 簡介 99
4.2 創(chuàng)建項目和安裝EF Core 99
4.3 創(chuàng)建數(shù)據(jù)模型 99
4.4 創(chuàng)建數(shù)據(jù)上下文 100
4.5 創(chuàng)建數(shù)據(jù)庫 100
4.6 簡單使用 101
4.7 小結(jié) 102
第5章 實體模型 103
5.1 實體類型和實體模型配置 103
5.1.1 基本實體類型 104
5.1.2 基礎(chǔ)實體模型配置 105
5.1.3 排序規(guī)則 108
5.1.4 值生成和計算屬性 109
5.1.5 影子屬性 112
5.1.6 幕后字段 112
5.1.7 模型字段 113
5.1.8 鍵 114
5.1.9 索引 117
5.1.10 并發(fā)標(biāo)記與行版本 118
5.1.11 值轉(zhuǎn)換器 119
5.1.12 值比較器和屬性快照 121
5.1.13 數(shù)據(jù)種子 123
5.1.14 構(gòu)造函數(shù) 124
5.1.15 繼承 127
5.1.16 無鍵實體類型 129
5.1.17 實體的多重映射 130
5.1.18 索引器屬性、共享類型實體和屬性包 131
5.2 全局查詢過濾器 132
5.3 自定義實體模型注解 132
5.4 自定義數(shù)據(jù)庫函數(shù)和映射 133
5.4.1 標(biāo)量值函數(shù)映射 133
5.4.2 表值函數(shù)映射 134
5.4.3 存儲過程映射 135
5.5 在一個上下文類型中使用多個模型 136
5.6 小結(jié) 137
第6章 實體模型的關(guān)系 138
6.1 概念和術(shù)語簡介 138
6.2 實體模型的關(guān)系與影子屬性 138
6.3 一對一關(guān)系 139
6.3.1 實體類型和關(guān)系配置 140
6.3.2 表共享(表拆分) 141
6.3.3 從屬實體類型 142
6.4 一對多關(guān)系 143
6.4.1 實體類型和關(guān)系配置 143
6.4.2 自關(guān)聯(lián)與樹形實體類型 145
6.4.3 從屬實體類型的集合 145
6.5 多對多關(guān)系 146
6.5.1 顯式映射 146
6.5.2 隱式映射 148
6.6 模型關(guān)系的級聯(lián)刪除 149
6.7 小結(jié) 151
第7章 管理實體模型和數(shù)據(jù)庫架構(gòu) 152
7.1 遷移 152
7.1.1 安裝遷移工具 153
7.1.2 管理遷移 154
7.1.3 應(yīng)用遷移 155
7.1.4 自定義遷移操作 156
7.1.5 使用獨立的遷移項目 162
7.1.6 為模型提供多個遷移 163
7.1.7 自定義遷移歷史記錄 164
7.2 逆向工程 165
7.3 EF Core Power Tools 165
7.4 小結(jié) 165
第8章 管理數(shù)據(jù) 166
8.1 基礎(chǔ)保存 166
8.1.1 添加實體 166
8.1.2 更新實體 167
8.1.3 刪除實體 168
8.1.4 訂閱保存事件和注冊保存攔截器 169
8.2 保存相關(guān)實體 170
8.2.1 同時添加多個相關(guān)實體 170
8.2.2 為主實體單獨添加從實體 171
8.2.3 更改實體的關(guān)系 172
8.2.4 刪除關(guān)系 173
8.3 并發(fā)沖突 174
8.4 事務(wù) 175
8.4.1 簡單事務(wù) 175
8.4.2 跨上下文事務(wù) 176
8.4.3 使用外部事務(wù) 177
8.4.4 保存點 178
8.5 異步保存 178
8.6 實體跟蹤器和實體追蹤圖 179
8.6.1 基礎(chǔ)使用 179
8.6.2 訂閱實體跟蹤事件 180
8.7 小結(jié) 180
第9章 查詢數(shù)據(jù) 181
9.1 基礎(chǔ)查詢 181
9.1.1 查詢數(shù)據(jù)集合 181
9.1.2 查詢單個數(shù)據(jù) 182
9.1.3 查詢標(biāo)量值 183
9.1.4 引用影子屬性 183
9.1.5 查詢標(biāo)記 184
9.2 復(fù)雜查詢 184
9.2.1 結(jié)果投影 184
9.2.2 連接查詢 185
9.2.3 分組查詢 187
9.2.4 臨時禁用全局查詢過濾器 188
9.3 原始SQL查詢 188
9.4 映射的自定義函數(shù) 189
9.4.1 使用標(biāo)量值函數(shù) 189
9.4.2 使用表值函數(shù)和存儲過程 189
9.4.3 自定義方法轉(zhuǎn)換 190
9.5 加載相關(guān)數(shù)據(jù) 191
9.5.1 預(yù)加載 191
9.5.2 延遲加載 192
9.5.3 顯式加載 195
9.5.4 拆分查詢 195
9.6 跟蹤和非跟蹤查詢 196
9.7 顯式編譯查詢 197
9.8 查看生成的SQL語句 197
9.9 服務(wù)端查詢和客戶端查詢 198
9.10 命令攔截器 198
9.11 異步查詢 199
9.12 小結(jié) 199
第10章 Entity Framework Core共享功能 200
10.1 配置上下文 200
10.1.1 日志記錄 200
10.1.2 參數(shù)顯示 201
10.1.3 全局默認(rèn)拆分查詢 201
10.1.4 全局默認(rèn)基于標(biāo)識解析的非跟蹤查詢 201
10.2 自動重試 201
10.3 內(nèi)存數(shù)據(jù)庫 202
10.4 小結(jié) 202
第三篇 ASP.NET Core
第11章 快速入門 205
11.1 簡介 205
11.2 創(chuàng)建項目 205
11.3 小結(jié) 208
第12章 公共基礎(chǔ) 209
12.1 依賴注入 209
12.1.1 概述 209
12.1.2 在控制臺應(yīng)用中使用依賴注入 210
12.1.3 在ASP.NET Core應(yīng)用中使用依賴注入 214
12.1.4 EF Core中的依賴注入 216
12.1.5 面向切面編程 216
12.2 配置 223
12.2.1 簡介 223
12.2.2 在控制臺應(yīng)用中使用配置 224
12.2.3 在ASP.NET Core應(yīng)用中使用配置 224
12.3 選項 226
12.3.1 簡介 226
12.3.2 具名選項 226
12.3.3 數(shù)據(jù)變更同步和變更事件 226
12.3.4 后期處理 226
12.3.5 選項驗證 226
12.3.6 選項作用域 227
12.3.7 在控制臺應(yīng)用中使用選項 227
12.3.8 在ASP.NET Core應(yīng)用中使用選項 232
12.3.9 利用依賴注入的選項 233
12.4 日志 234
12.4.1 日志類別 235
12.4.2 嚴(yán)重性級別 235
12.4.3 事件Id 235
12.4.4 消息模板 236
12.4.5 記錄異常 236
12.4.6 作用域 236
12.4.7 運行時更改過濾器級別 236
12.4.8 在簡單控制臺應(yīng)用中使用日志 236
12.4.9 記錄提供程序 237
12.5 主機 238
12.5.1 托管服務(wù) 238
12.5.2 環(huán)境 240
12.5.3 通用主機 240
12.6 Web主機 243
12.6.1 托管到Windows服務(wù)和Linux服務(wù) 243
12.6.2 .NET后臺服務(wù) 244
12.7 中間件和請求處理管道 245
12.7.1 中間件和請求處理管道的關(guān)系 245
12.7.2 終端中間件和管道短路 246
12.7.3 中間件的順序 247
12.7.4 管道分支 248
12.7.5 內(nèi)置中間件 249
12.7.6 自定義中間件 251
12.8 Startup類 254
12.8.1 基礎(chǔ)使用 254
12.8.2 多環(huán)境Startup 255
12.8.3 Startup過濾器 256
12.8.4 .NET 6新增的最小配置API 258
12.9 靜態(tài)文件 258
12.9.1 基礎(chǔ)使用 258
12.9.2 目錄瀏覽 259
12.9.3 靜態(tài)文件授權(quán) 260
12.10 動態(tài)響應(yīng)和靜態(tài)資源壓縮 260
12.10.1 動態(tài)響應(yīng)壓縮 260
12.10.2 靜態(tài)資源壓縮 261
12.11 緩存 261
12.11.1 客戶端緩存 261
12.11.2 緩存服務(wù)和響應(yīng)緩存中間件 262
12.11.3 頁面數(shù)據(jù)緩存 264
12.12 流量控制 264
12.12.1 請求頻率控制 264
12.12.2 響應(yīng)發(fā)送速率控制 264
12.13 端點路由 279
12.13.1 傳統(tǒng)路由回顧 279
12.13.2 端點路由簡介 279
12.13.3 基礎(chǔ)使用 280
12.13.4 鏈接生成 280
12.13.5 路由模板 281
12.13.6 路由約束 281
12.13.7 自定義約束 282
12.13.8 參數(shù)轉(zhuǎn)換器 283
12.13.9 自定義端點 284
12.14 發(fā)送HTTP請求 289
12.14.1 基礎(chǔ)使用 290
12.14.2 請求中間件 293
12.14.3 基于策略的處理程序和彈性故障處理 295
12.14.4 請求標(biāo)頭傳播和分布式鏈路追蹤 297
12.14.5 管理和使用Cookie 298
12.15 錯誤處理 299
12.16 托管和部署 301
12.17 小結(jié) 303
第13章 身份認(rèn)證 304
13.1 基礎(chǔ)身份認(rèn)證 304
13.1.1 Cookie認(rèn)證 304
13.1.2 JWT認(rèn)證 308
13.1.3 自定義身份認(rèn)證 313
13.1.4 接入第三方身份認(rèn)證服務(wù) 314
13.2 ASP.NET Core Identity 318
13.2.1 基礎(chǔ)使用 319
13.2.2 自定義用戶數(shù)據(jù) 321
13.2.3 賬戶確認(rèn)和密碼重置 322
13.2.4 雙因素身份驗證和二維碼生成 323
13.2.5 隱私數(shù)據(jù)保護 323
13.3 OpenIddict 329
13.3.1 OpenId Connect(OIDC)和OAuth協(xié)議簡介 329
13.3.2 OpenIddict簡介 332
13.3.3 基礎(chǔ)使用 332
13.4 小結(jié) 340
第14章 授權(quán) 341
14.1 定義授權(quán)策略 341
14.2 配置授權(quán)策略 343
14.3 高級功能簡介 345
14.3.1 授權(quán)策略提供程序 345
14.3.2 自定義授權(quán)結(jié)果的處理方式 345
14.4 小結(jié) 345
第15章 MVC 346
15.1 簡介 346
15.1.1 MVC模式 346
15.1.2 ASP.NET Core MVC 347
15.2 模型 347
15.2.1 基礎(chǔ)使用 347
15.2.2 自定義數(shù)據(jù)源 350
15.2.3 特殊數(shù)據(jù)類型 350
15.2.4 從模型綁定中排除特定類型 350
15.2.5 模型綁定的全球化 350
15.2.6 手動調(diào)用模型綁定 351
15.2.7 輸入格式化器 351
15.2.8 為輸入格式化器自定義特定類型的轉(zhuǎn)換器 352
15.2.9 自定義模型綁定 352
15.2.10 模型驗證 355
15.3 控制器和動作 359
15.3.1 基礎(chǔ)使用 359
15.3.2 控制器和動作中的依賴注入 360
15.3.3 IActionResult 361
15.4 MVC過濾器 362
15.4.1 簡介 362
15.4.2 授權(quán)過濾器 364
15.4.3 自定義過濾器 364
15.4.4 依賴注入 366
15.4.5 配置過濾器 367
15.5 視圖 368
15.5.1 Razor引擎簡介 368
15.5.2 基礎(chǔ)Razor語法 368
15.5.3 特殊Razor文件 373
15.5.4 標(biāo)簽助手 374
15.5.5 視圖組件 378
15.5.6 客戶端模型驗證 381
15.5.7 運行時視圖編譯 386
15.5.8 視圖編碼 386
15.5.9 視圖發(fā)現(xiàn) 387
15.6 區(qū)域 388
15.7 MVC路由 389
15.7.1 傳統(tǒng)路由 389
15.7.2 特性路由 390
15.7.3 路由參數(shù)轉(zhuǎn)換器 391
15.8 應(yīng)用程序模型 391
15.9 應(yīng)用程序部件 392
15.10 小結(jié) 393
第16章 Razor Pages 394
16.1 簡介 394
16.2 基礎(chǔ)使用 395
16.3 頁面處理器 396
16.3.1 默認(rèn)約定 396
16.3.2 相關(guān)的Razor指令 397
16.3.3 后臺代碼 398
16.4 模型綁定 398
16.5 Razor Pages過濾器 399
16.5.1 全局配置 399
16.5.2 重寫基類的方法 400
16.5.3 特性配置 400
16.6 Razor Pages路由 400
16.7 小結(jié) 401
第17章 Blazor 402
17.1 簡介 402
17.2 公共基礎(chǔ) 403
17.2.1 依賴注入 403
17.2.2 配置 404
17.2.3 啟動 405
17.2.4 環(huán)境 407
17.2.5 路由 408
17.2.6 錯誤處理 408
17.3 Razor組件 410
17.3.1 相關(guān)的Razor指令 410
17.3.2 后臺代碼和分部類支持 411
17.3.3 輸出原始HTML 412
17.3.4 依賴注入 412
17.3.5 路由和導(dǎo)航 413
17.3.6 組件參數(shù) 414
17.3.7 屬性展開和任意參數(shù) 414
17.3.8 子內(nèi)容 415
17.3.9 組件和元素引用 416
17.3.10 使用@key控制是否保留元素和組件 416
17.3.11 Razor模板 417
17.3.12 模板化組件 417
17.3.13 級聯(lián)值和參數(shù) 419
17.3.14 數(shù)據(jù)綁定 421
17.3.15 事件處理 423
17.3.16 生命周期 425
17.3.17 組件渲染 427
17.3.18 虛擬滾動組件 428
17.3.19 動態(tài)組件 429
17.3.20 表單和驗證 429
17.3.21 CSS隔離 429
17.3.22 常用內(nèi)置組件簡介 430
17.4 服務(wù)端預(yù)渲染 431
17.4.1 基礎(chǔ)使用 431
17.4.2 保持組件狀態(tài) 434
17.5 布局 437
17.6 發(fā)送HTTP請求 437
17.7 JavaScript互操作 437
17.7.1 從.NET調(diào)用JavaScript 438
17.7.2 從JavaScript調(diào)用.NET 439
17.8 狀態(tài)管理 442
17.9 程序集延遲加載 443
17.9.1 基礎(chǔ)使用 443
17.9.2 延遲加載的程序集中的可路由組件 444
17.10 漸進式Web應(yīng)用 445
17.10.1 簡介 445
17.10.2 啟用PWA支持 445
17.11 調(diào)試 447
17.11.1 準(zhǔn)備工作 447
17.11.2 啟用調(diào)試 448
17.11.3 在瀏覽器中調(diào)試 448
17.12 托管和部署 450
17.12.1 常用發(fā)布選項 450
17.12.2 關(guān)于應(yīng)用基地址和在同一個服務(wù)端同時托管多個應(yīng)用的注意事項 451
17.12.3 AOT編譯、IL裁剪和引用Native代碼功能簡介 462
17.13 小結(jié) 463
第18章 Razor類庫 464
18.1 簡介 464
18.2 靜態(tài)資源組織 464
18.3 小結(jié) 465
第19章 Web API 466
19.1 基礎(chǔ)使用 466
19.1.1 默認(rèn)約定的API控制器 466
19.1.2 Web API路由 468
19.1.3 模型綁定 468
19.2 API版本、Open API和Swagger 469
19.2.1 多版本API 470
19.2.2 Swashbuckle 471
19.3 小結(jié) 473
第20章 遠程過程調(diào)用 474
20.1 WCF回顧 474
20.2 gRPC 475
20.2.1 PROTO文件 475
20.2.2 服務(wù)端 475
20.2.3 客戶端 478
20.2.4 在Blazor WebAssembly應(yīng)用中使用gRPC-Web客戶端 480
20.3 小結(jié) 481
第21章 實時通信 482
21.1 早期解決方案回顧 482
21.2 WebSocket簡介 482
21.3 SignalR 483
21.3.1 集線器 483
21.3.2 流式連接 490
21.3.3 消息格式協(xié)議 492
21.3.4 應(yīng)用承載力擴展 492
21.3.5 客戶端 493
21.4 小結(jié) 507
第22章 應(yīng)用安全 508
22.1 數(shù)據(jù)保護 508
22.1.1 基礎(chǔ)使用 508
22.1.2 層次結(jié)構(gòu) 510
22.1.3 時效性數(shù)據(jù)保護 510
22.2 管理機密 510
22.3 歐盟通用數(shù)據(jù)保護條例(GDPR) 511
22.4 防御惡意攻擊 512
22.4.1 跨站點請求偽造(XSRF/CSRF) 513
22.4.2 開放重定向攻擊 514
22.4.3 跨站點腳本攻擊(XSS) 514
22.5 一般安全功能 515
22.5.1 強制執(zhí)行HTTPS 515
22.5.2 HTTP嚴(yán)格傳輸安全協(xié)議(HSTS) 515
22.5.3 HTTPS和響應(yīng)壓縮 516
22.5.4 跨域資源共享(CORS) 516
22.5.5 內(nèi)容安全策略(CSP) 517
22.5.6 跨應(yīng)用共享Cookie 517
22.6 小結(jié) 517
第23章 高級功能 518
23.1 全球化和本地化 518
23.1.1 服務(wù)注冊和請求管道配置 518
23.1.2 準(zhǔn)備本地化文本 519
23.1.3 使用本地化服務(wù) 520
23.1.4 準(zhǔn)備語言設(shè)置界面 522
23.2 GraphQL 523
23.2.1 服務(wù)端 523
23.2.2 客戶端 562
23.3 Elsa 565
23.3.1 基礎(chǔ)概念 565
23.3.2 搭建Web服務(wù)器 566
23.3.3 簡單自動工作流 568
23.3.4 人機交互工作流 569
23.4 MiniProfiler 572
23.5 小結(jié) 573
第24章 其他.NET功能 574
24.1 C/C 互操作 574
24.1.1 CppSharp簡介 574
24.1.2 基礎(chǔ)使用 575
24.2 程序集的動態(tài)載入和卸載 578
24.3 小結(jié) 580
第四篇 實戰(zhàn)演練
第25章 電子商城項目 583
25.1 項目定位 583
25.2 需求分析 584
25.2.1 統(tǒng)一的身份認(rèn)證和授權(quán)中心 584
25.2.2 買家的獨立網(wǎng)頁渲染和業(yè)務(wù)邏輯服務(wù) 584
25.2.3 賣家的店鋪、商品和訂單管理 584
25.3 架構(gòu)設(shè)計 585
25.4 創(chuàng)建解決方案和Git存儲庫 586
25.4.1 創(chuàng)建解決方案 586
25.4.2 創(chuàng)建Git存儲庫 587
25.5 定義應(yīng)用域的通用抽象接口 588
25.5.1 實體相關(guān)接口 588
25.5.2 倉儲相關(guān)接口 591
25.5.3 命令和事件相關(guān)接口 596
25.6 開發(fā)通用基礎(chǔ)設(shè)施 601
25.6.1 EF Core倉儲 601
25.6.2 MediatR總線 605
25.7 開發(fā)身份認(rèn)證和授權(quán)中心 608
25.7.1 EF Core擴展 608
25.7.2 Identity實體和上下文 609
25.7.3 集成Identity到ASP.NET Core托管網(wǎng)站 621
25.7.4 集成第三方賬號登錄 624
25.7.5 增加角色管理功能 625
25.7.6 添加OpenIddict服務(wù)端組件 627
25.8 開發(fā)買家商城 633
25.8.1 商城服務(wù)實體 633
25.8.2 商城服務(wù) 642
25.8.3 商城服務(wù)API站點 646
25.8.4 商城網(wǎng)站的初步開發(fā) 660
25.8.5 訂單服務(wù) 671
25.8.6 訂單服務(wù)API站點 674
25.8.7 商城網(wǎng)站的購物業(yè)務(wù) 676
25.9 開發(fā)賣家管理中心 681
25.9.1 賣家API 681
25.9.2 賣家管理應(yīng)用 700
25.10 小結(jié) 723