內容簡介
ASP.NET Core是微軟推出的跨平台、開放原始碼的Web開發框架。本書秉持“現學現用”的 原則,知識講解通俗易懂,並配有示例代碼。每個示例都是針對知識點而設計的,代碼量適中, 功能和結構簡單,便於讀者參考學習和擴展改造。 全書共18章。第1章和第2章講述了ASP.NET Core應用程式的初始化過程以及運行環境的設定; 第3章單獨介紹了ASP.NET Core應用程式的設計模式—組件化,即依賴注入技術;第4章和第5 章講述了配置應用程式的方法,包括使用配置檔案和選項模式;第6章和第7章講述了HTTP管道和 HTTP狀態存儲;第8~11章涉及Web開發的重點知識:Razor頁面、MVC框架、模型綁定及Web API;
目錄
第 1 章 初始化ASP.NET Core 應用程式. 1
1.1 應用程式的啟動過程 ..1
1.2 WebApplicationBuilder 類 ..2
1.3 啟動應用程式.3
1.4 使用 Host 初始化應用程式 4
1.4.1 通用主機 5
1.4.2 示例:簡單的通用主機 .5
1.4.3 Web 主機 7
1.5 設定應用程式的 URL..9
1.5.1 調用 UseUrls()方法 .9
1.5.2 使用 WebApplication 類的 Urls 屬性 .. 10
1.5.3 調用 Run()方法時傳遞URL .. 10
1.5.4 通過 ServerAddressesFeature 對象設定 URL 11
1.5.5 使用命令行參數 12
1.5.6 使用配置檔案. 13
1.5.7 使用環境變數. 13
1.5.8 使用 launchSettings.json 檔案 14
1.5.9 Kestrel 伺服器的偵聽地址. 14
1.5.10 通過 HTTP.sys 配置 URL . 15
1.5.11 PreferHostingUrls()方法的作用 .. 15
1.6 應用程式生命周期事件16
第 2 章 運行環境. 18
2.1 定義運行環境.. 18
2.2 Is{EnvironmentName}擴展方法 . 19
2.3 多運行環境下的配置檔案 21
2.4 用於環境篩選的 Razor 標記 23
2.5 運行環境與依賴注入25
第 3 章 依賴注入. 28
3.1 依賴注入與服務容器28
3.1.1 ServiceCollection 類 . 31
IV 深入淺出:ASP.NET Core
3.1.2 ServiceProvider 類 32
3.2 .NET 項目中的依賴注入.. 32
3.3 ASP.NET Core 項目中的依賴注入. 33
3.4 構建存在依賴關係的服務 35
3.5 服務的生存期.. 38
3.6 GetService()方法與 GetRequiredService()方法的區別. 41
3.7 注入多個服務實例. 42
3.8 容易被忽略的問題. 46
第 4 章 配置應用程式 48
4.1 配置的基本結構 . 48
4.2 在.NET 應用程式中使用配置 . 49
4.3 在 ASP.NET Core 應用程式中使用配置 .. 51
4.3.1 配置的數據來源 51
4.3.2 查看所有配置信息 51
4.4 IConfigurationBuilder 接口.. 52
4.5 ConfigurationManager 類 . 53
4.6 IConfigurationSource 接口與 IConfigurationProvider 接口 54
4.6.1 自定義擴展點. 55
4.6.2 示例:來自CSV 檔案的配置 56
4.7 JSON 配置 59
4.7.1 示例:訪問JSON 數組對象.. 62
4.7.2 示例:自動重新載入配置.. 63
4.8 XML 配置 . 64
4.9 環境變數 .. 67
4.9.1 設定環境變數前綴 68
4.9.2 替換默認的ASPNETCORE_前綴70
4.9.3 示例:替換環境變數前綴.. 70
4.9.4 分層配置結構. 71
4.10 命令行參數 72
4.11 ini 配置 75
4.12 配置與依賴注入 78
4.12.1 示例:將 IConfiguration 注入 MVC 控制器 78
4.12.2 示例:通過配置選擇哈希算法 .. 79
4.13 連結多棵配置樹 82
第 5 章 選項模式. 85
5.1 選項模式概述.. 85
目錄 V
5.2 服務容器的擴展方法87
5.3 各接口之間的關係. 87
5.3.1 IConfigureOptions<TOptions>接口與 IConfigureNamedOptions<TOptions>接口 .. 87
5.3.2 IPostConfigureOptions<TOptions>接口 .. 88
5.3.3 IValidateOptions<TOptions>接口 . 88
5.3.4 IOptionsFactory<TOptions>接口 .. 89
5.3.5 完整的流程圖. 90
5.4 選項類的封裝接口. 91
5.4.1 示例:在 MVC 控制器中訪問選項類. 92
5.4.2 示例:自動更新選項類 .. 93
5.5 帶名稱的選項組 . 95
5.6 後期配置 .. 98
5.7 選項類的驗證.. 99
5.7.1 內置的驗證方式 . 100
5.7.2 使用數據批註.. 102
5.8 處理帶參數的構造函式 . 105
5.9 直接實現 IOptions 接口 . 108
第 6 章 HTTP 管道 110
6.1 HTTP 管道與中間件 .. 110
6.2 中間件的實現方法.. 110
6.3 通過委託實現中間件 ..111
6.3.1 示例:Use()方法的簡單用法.. 114
6.3.2 HTTP 管道的“短路” . 115
6.3.3 Run()方法 . 116
6.4 通過類實現中間件.. 117
6.4.1 帶參數的中間件 . 118
6.4.2 中間件類與依賴注入 119
6.5 通過 IMiddleware 接口實現中間件 120
6.6 終結點. 121
6.6.1 示例:常見的HTTP 請求方式 .. 123
6.6.2 示例:同時使用 Razor Pages 和 MVC . 125
6.6.3 為終結點分配名稱. 127
6.6.4 元數據 129
6.7 有條件地執行中間件 . 130
6.7.1 示例:調用包含 user_id 欄位的中間件.. 131
6.7.2 示例:只允許以 POST 方式調用 Web API . 132
VI 深入淺出:ASP.NET Core
第 7 章 HTTP 狀態存儲..135
7.1 HTTP 上下文. 135
7.1.1 示例:在中間件中設定回響標頭.. 136
7.1.2 示例:在 Map*()方法中訪問HTTP 上下文 .. 137
7.1.3 示例:使用Razor 標記呈現 HTTP 請求標頭 138
7.1.4 示例:在 MVC 中訪問 HTTP 上下文 .. 140
7.2 HTTP 訊息頭. 141
7.2.1 HeaderNames 類.. 143
7.2.2 訊息頭的分類.. 144
7.2.3 分析複雜訊息頭 . 145
7.3 查詢字元串148
7.3.1 讀取查詢參數.. 149
7.3.2 多值參數 .. 150
7.4 表單數據151
7.4.1 讀取簡單的表單數據 151
7.4.2 檔案上傳 .. 153
7.5 Cookie . 157
7.6 HttpContext 類的 Items 屬性 159
7.7 會話 . 160
7.7.1 ISession 接口 161
7.7.2 設定會話 Cookie 的名稱.. 164
7.7.3 示例:將會話數據存儲到JSON 檔案中 . 164
第 8 章 Razor頁面172
8.1 Razor 頁面的特點172
8.2 Razor 語法 . 173
8.2.1 兩種表達式 .. 173
8.2.2 代碼塊 174
8.2.3 注釋 175
8.2.4 流程控制 .. 176
8.3 開啟 Razor 頁面功能.. 177
8.4 Razor 頁面檔案 178
8.5 頁面檔案的搜尋路徑 . 179
8.5.1 配置 RazorPagesOptions 選項類 180
8.5.2 便捷的擴展方法 . 180
8.6 頁面路由181
8.6.1 通過@page 指令設定路由規則.. 181
目錄 VII
8.6.2 通過約定模型定義路由規則 .. 182
8.7 頁面模型類184
8.7.1 頁面自身作為模型類 185
8.7.2 從 PageModel 派生類 185
8.7.3 通過特性類實現頁面模型類 .. 186
8.8 頁面處理程式 187
8.8.1 通用的處理程式 . 188
8.8.2 解決 POST 請求時出現的錯誤 .. 189
8.8.3 使用多個處理程式. 190
8.8.4 通過路由參數選擇處理程式 .. 192
8.8.5 自定義的處理程式模型193
第 9 章 MVC框架 .199
9.1 MVC 基本概念 . 199
9.2 啟用 MVC 功能 199
9.3 控制器. 200
9.3.1 示例:從 ControllerBase 類派生 203
9.3.2 示例:從 Controller 類派生 205
9.3.3 示例:使用ControllerAttribute.. 205
9.3.4 示例:使用Controller 後綴 206
9.3.5 自定義控制器的名稱 207
9.3.6 示例:ControllerNameAttribute 類 207
9.3.7 自定義操作方法的名稱208
9.3.8 示例:CustActionNameAttribute 類 .. 208
9.3.9 示例:ActionNameAttribute 類 .. 209
9.4 MVC 路由規則 . 210
9.4.1 全局路由規則.. 211
9.4.2 示例:註冊兩條全局路由規則 .. 211
9.4.3 局部路由規則.. 212
9.4.4 IRouteTemplateProvider 接口.. 213
9.4.5 通過實現約定接口定義路由規則.. 214
9.4.6 示例:CustPrefixRouteConvention 類 .. 215
9.5 限制操作方法所支持的 HTTP 請求 .. 217
9.5.1 示例:只支持HTTP-PUT 請求的操作方法 217
9.5.2 內置特性類 .. 218
9.6 區域 . 220
9.7 視圖 . 221
VIII深入淺出:ASP.NET Core
9.7.1 視圖檔案的默認存放路徑 221
9.7.2 自定義視圖的路徑格式222
9.7.3 布局視圖 .. 225
9.7.4 示例:布局視圖的查找順序 .. 226
9.7.5 示例:配置Razor Pages 布局視圖的查找路徑 . 229
9.7.6 _ViewImports 與_ViewStart 檔案 .. 231
9.7.7 示例:_ViewStart 檔案的替換行為 .. 232
9.8 IViewLocationExpander 接口 233
9.8.1 示例:多版本視圖. 234
9.8.2 示例:根據URL 查詢參數擴展視圖路徑.. 237
9.8.3 LanguageViewLocationExpander 類 .. 240
9.9 局部視圖242
9.9.1 示例:成績單.. 243
9.9.2 示例:導航欄.. 246
9.10 視圖組件.. 248
9.10.1 示例:一個簡單的視圖組件.. 249
9.10.2 視圖檔案的查找路徑 250
9.10.3 示例:帶參數的視圖組件.. 251
9.10.4 通過標記幫助器調用視圖組件 . 253
9.10.5 示例:Greeting 視圖組件 254
9.10.6 示例:在 MVC 控制器中調用視圖組件. 255
9.10.7 兩個特性類. 255
9.11 識別其他程式集中的控制器.. 256
9.11.1 示例:使用ApplicationPartAttribute 類 . 256
9.11.2 示例:使用AddApplicationPart()擴展方法 .. 257
9.11.3 示例:使用ApplicationPartManager 類 .. 259
第 10 章 模型綁定 .261
10.1 概述 .. 261
10.2 自動綁定 .. 262
10.2.1 示例:計算器. 263
10.2.2 示例:綁定數組類型的數據.. 264
10.2.3 示例:綁定複雜類 266
10.2.4 多個參數的模型綁定 268
10.2.5 示例:綁定 3 個參數 268
10.2.6 字典類型的模型綁定 270
10.2.7 示例:綁定字典數據 270
目錄 IX
10.2.8 示例:綁定 IFormCollection 類型 272
10.2.9 示例:MD5 計算器 .. 273
10.2.10 綁定 IFormFile 和 IFormFileCollection 類型 .. 274
10.2.11 示例:上傳一個文本檔案275
10.2.12 示例:上傳多個檔案 . 276
10.3 設定模型綁定的來源 278
10.3.1 示例:綁定 HTTP 訊息頭 .. 278
10.3.2 示例:從 HTTP 訊息正文提取數據. 279
10.3.3 示例:與路由參數綁定 .. 280
10.3.4 示例:FromServices 特性的使用. 280
10.3.5 示例:混合使用 From*特性類 . 282
10.3.6 示例:將 From*特性類套用於屬性成員 283
10.4 自定義 IValueProvider 接口 284
10.4.1 示例:由自定義字元串提供的值. 285
10.4.2 示例:CookieValueProvider 288
10.5 IModelBinder 接口 292
10.5.1 內置綁定器 . 293
10.5.2 示例:AddressInfoModelBinder 類 .. 294
10.6 BindRequiredAttribute 類與 BindNeverAttribute 類 . 296
10.7 綁定到屬性成員. 299
10.7.1 示例:控制器的屬性綁定 .. 299
10.7.2 示例:PageModel 中的屬性綁定 . 300
10.7.3 示例:CancellationToken 類型的屬性綁定 302
第 11 章 Web API .305
11.1 Web API 基礎 . 305
11.1.1 ControllerBase 類與 Controller 類 . 305
11.1.2 ApiController 特性 306
11.1.3 示例:一個簡單的 Web API .. 306
11.1.4 示例:以 POST 方式提交數據.. 308
11.2 XML 格式 310
11.2.1 示例:常規的XML 序列化方案.. 311
11.2.2 示例:使用 XmlDataContractSerializer 方案 314
11.3 選擇回響格式. 316
11.3.1 示例:通過 Accept 訊息頭選擇回響格式.. 316
11.3.2 示例:使用格式過濾器 .. 317
11.4 自定義格式. 319
X 深入淺出:ASP.NET Core
11.4.1 示例:CustDataInputFormatter 類 319
11.4.2 示例:BytesToHexOutputFormatter 類 323
11.5 極小 API .. 325
11.5.1 示例:一些簡單的極小 API 例子. 325
11.5.2 示例:在極小API 上使用數據源特性 327
11.5.3 上傳檔案.. 328
11.5.4 示例:直接讀取檔案流 .. 328
11.5.5 示例:上傳多個檔案 330
11.5.6 IResult 接口. 332
11.5.7 示例:Results 類的使用.. 333
11.6 API 瀏覽功能 . 333
11.6.1 IApiDescriptionGroupCollectionProvider 接口.. 334
11.6.2 示例:列出已定義的 Web API.. 334
11.6.3 API 約定 .. 337
11.6.4 Swagger 框架.. 339
11.6.5 示例:使用 Swagger 生成 API 文檔 340
第 12 章 過濾器.343
12.1 過濾器的執行過程 343
12.1.1 示例:觀察過濾器的運行順序 . 344
12.1.2 示例:同時實現多個接口.. 348
12.2 過濾器的作用域. 349
12.2.1 示例:全局過濾器 349
12.2.2 示例:特性化的過濾器 .. 350
12.3 在 Razor Pages 中使用過濾器352
12.3.1 示例:在 Razor 標記頁和頁面模型類上套用過濾器 . 352
12.3.2 示例:在 Razor Pages 中套用全局過濾器 . 353
12.3.3 頁面處理程式的過濾器 .. 354
12.3.4 示例:實現 IPageFilter 接口 . 354
12.4 異步過濾器接口. 355
12.4.1 示例:實現異步授權過濾器.. 356
12.4.2 示例:實現異步資源過濾器.. 356
12.5 IAlwaysRunResultFilter 接口 . 358
12.6 IFilterFactory 接口 360
12.6.1 示例:訪問服務容器中的過濾器 . 360
12.6.2 示例:使用 TypeFilterAttribute 類創建過濾器實例 361
12.6.3 示例:使用 ServiceFilterAttribute 類訪問服務容器中的過濾器 . 363
目錄 XI
12.7 過濾器的運行順序 364
12.7.1 示例:過濾器的作用域與運行順序 364
12.7.2 示例:自定義過濾器的運行順序 . 368
12.8 抽象的過濾器特性類 369
12.8.1 示例:重寫 ActionFilterAttribute 類 370
12.8.2 示例:重寫 ExceptionFilterAttribute 類 . 371
第 13 章 標記幫助器.372
13.1 標記幫助器簡介. 372
13.1.1 示例:為<span>標記添加“加粗”功能 373
13.1.2 示例:<url>標記幫助器 . 374
13.1.3 示例:使用標記幫助器設定HTML 元素的文本樣式 375
13.2 將標記幫助器註冊到服務容器 . 377
13.3 內置的標記幫助器 380
13.3.1 示例:快取當前時間 380
13.3.2 示例:用<button>元素提交表單.. 381
13.3.3 示例:asp-for 屬性的使用. 382
13.3.4 示例:呈現驗證信息 384
13.4 標記幫助器組件. 386
13.4.1 示例:在<body>元素內插入 CSS 樣式 .. 387
13.4.2 示例:使用 ITagHelperComponentManager 對象註冊標記幫助器組件389
第 14 章 靜態檔案 .392
14.1 靜態檔案簡介. 392
14.2 使用靜態檔案. 393
14.2.1 示例:訪問圖像檔案 393
14.2.2 示例:修改 WEBROOT 路徑 395
14.2.3 示例:統計輸入的字元數量.. 397
14.2.4 示例:合併多個目錄 398
14.3 目錄瀏覽.. 400
14.3.1 示例:瀏覽外部目錄 401
14.3.2 示例:自定義檔案類型映射.. 401
14.4 檔案服務.. 410
第 15 章 路由約束 .412
15.1 路由約束的作用. 412
15.2 IRouteConstraint 接口 .. 412
15.3 內置的路由約束. 413
15.3.1 示例:雙精度數值約束 .. 415
XII深入淺出:ASP.NET Core
15.3.2 示例:限制字元串長度 .. 415
15.3.3 示例:特定格式的訂單號 .. 416
15.3.4 示例:限制整數值的範圍.. 417
15.4 自定義路由約束. 417
第 16 章 SignalR419
16.1 WebSocket 419
16.1.1 示例:用 JavaScript 實現客戶端.. 419
16.1.2 示例:用.NET 控制台實現WebSocket 客戶端 422
16.1.3 子協定.. 424
16.2 SignalR 基礎 427
16.2.1 SignalR 中心 .. 428
16.2.2 示例:簡易計算器 428
16.2.3 示例:使用面向.NET 的 SignalR 庫 430
16.3 調用客戶端. 433
16.3.1 示例:聊天室. 433
16.3.2 將客戶端定義為接口 435
16.3.3 示例:實時更新進度條 .. 436
16.3.4 示例:記錄連線狀態 438
第 17 章 Blazor..442
17.1 Blazor 概述 . 442
17.2 伺服器託管. 443
17.2.1 示例:使用 Razor Pages 承載 Blazor 套用 444
17.2.2 示例:在 MVC 視圖中承載Blazor 套用 446
17.2.3 初始化腳本 . 448
17.2.4 示例:使用初始化腳本 .. 449
17.2.5 示例:手動添加 modules.json 檔案. 450
17.3 WebAssembly 託管 451
17.3.1 示例:手動創建 Blazor WebAssembly 項目.. 452
17.3.2 示例:用 node.js 開發 Blazor WebAssembly 伺服器 .. 454
17.3.3 示例:初始化腳本 457
17.3.4 DevServer 458
17.4 路由組件.. 459
17.4.1 示例:路由組件的簡單套用.. 460
17.4.2 示例:使用路由參數 461
17.4.3 示例:使用[Route]特性 .. 463
17.5 布局組件.. 463
目錄 XIII
17.5.1 示例:導航欄. 464
17.5.2 示例:將普通組件用於布局.. 466
17.6 組件參數.. 466
17.6.1 示例:嵌套組件的參數傳遞.. 466
17.6.2 示例:頂層組件的參數傳遞(Blazor Server) 467
17.6.3 示例:頂層組件的參數傳遞(Blazor WebAssembly) . 468
17.7 級聯參數.. 469
17.7.1 示例:根據類型接收級聯參數 . 469
17.7.2 示例:根據命名接收級聯參數 . 472
17.8 事件 .. 473
17.8.1 示例:計數器. 476
17.8.2 示例:記錄滑鼠指針的位置.. 476
17.8.3 EventCallback 結構體 .. 477
17.8.4 示例:進度條組件 478
17.9 CSS 隔離.. 480
17.10 數據綁定 482
17.10.1 示例:綁定日期輸入元素.. 483
17.10.2 示例:使用oninput 事件 483
17.10.3 組件之間的綁定 484
17.10.4 示例:Slider 組件. 485
17.11 用.NET 代碼編寫組件 486
17.11.1 渲染樹 .. 487
17.11.2 示例:用.NET 代碼實現 App 和 Index 組件. 488
17.11.3 示例:使用依賴注入 491
17.12 .NET 與 JavaScript 互操作 493
17.12.1 示例:調用JavaScript 中的 alert()方法 . 494
17.12.2 示例:調用QRCode.js 生成二維碼. 494
17.12.3 示例:階乘計算器 496
17.12.4 示例:JavaScript 調用.NET 對象的實例方法 .. 497
第 18 章 驗證與授權.500
18.1 驗證與授權的關係 500
18.2 與驗證有關的核心服務.. 501
18.3 驗證處理程式. 501
18.3.1 示例:驗證 HTTP 訊息頭 502
18.3.2 示例:多個驗證方案共用一個 IAuthenticationHandler 接口 505
18.4 IAuthenticationSignInHandler 接口 .. 508
XIV 深入淺出:ASP.NET Core
18.5 驗證中間件. 515
18.6 授權處理程式與必要條件.. 519
18.6.1 示例:允許指定的部門訪問 .. 520
18.6.2 PassThroughAuthorizationHandler 類 522
18.7 授權策略 .. 525
18.7.1 示例:按用戶星級授權 525
18.7.2 示例:集成內置的 Cookie 驗證 529
18.7.3 示例:在終結點上套用授權策略 . 534