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