3dwoo大學簡體電腦書店
ASP.NET Core 6框架揭秘(上下冊)
( 簡體 字)
作者:蔣金楠類別:1. -> 程式設計 -> .NET -> ASP.NET
出版社:電子工業出版社ASP.NET Core 6框架揭秘(上下冊) 3dWoo書號: 55866
詢問書籍請說出此書號!
有庫存
NT售價: 1500
出版日:6/1/2022
頁數:1036
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121435669 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第 1 篇 初識編程
第 1 章 編程體驗 ..... 2
1.1 控制臺程序 ...... 2
1.1.1 構建開發環境 .... 2
1.1.2 命令行構建 .NET 應用 ..... 3
1.2 ASP.NET 應用 ...... 8
1.2.1 launchSettings.json ..... 8
1.2.2 Minimal API ..... 11
1.2.3 中間件 ..... 13
1.2.4 配置選項 ...... 17
1.2.5 診斷日志 ...... 19
1.2.6 路由 ..... 20
1.3 MVC ...... 21
1.3.1 定義 Controller ..... 21
1.3.2 引入視圖 ...... 22
1.4 gRPC ...... 24
1.4.1 定義服務 ...... 24
1.4.2 實現和承載 .... 26
1.4.3 調用服務 ...... 28
1.5 Dapr...... 29
1.5.1 構建開發環境 .... 29
1.5.2 服務調用 ...... 30
1.5.3 狀態管理 ...... 34
1.5.4 發布訂閱 ...... 38
1.5.5 Actor 模型 .... 40
第 2 篇 基礎框架
第 2 章 依賴注入(上) ..... 44
2.1 控制反轉 ...... 44
2.1.1 流程控制的反轉 .... 44
2.1.2 好萊塢法則 .... 47
2.1.3 流程定制 ...... 47
2.2 IoC 模式 ..... 48
2.2.1 模板方法 ...... 48
2.2.2 工廠方法 ...... 49
2.2.3 抽象工廠 ...... 51
2.3 依賴注入 ...... 53
2.3.1 由容器提供對象 .... 53
2.3.2 3 種注入方式 ..... 55
2.3.3 Service Locator 模式 .... 57
2.4 一個簡易版的依賴注入容器 .... 59
2.4.1 編程體驗 ...... 59
2.4.2 設計與實現 .... 63
2.4.3 擴展方法 ...... 69
第 3 章 依賴注入(下) ..... 73
3.1 利用容器提供服務 ..... 73
3.1.1 服務的注冊與消費 ..... 73
3.1.2 生命周期 ...... 76
3.1.3 服務注冊的驗證 .... 79
3.2 服務注冊 ...... 82
3.2.1 ServiceDescriptor .... 82
3.2.2 IServiceCollection ..... 83
3.3 服務的消費 ...... 87
3.3.1 IServiceProvider ..... 87
3.3.2 服務實例的創建 .... 89
3.3.3 生命周期 ...... 91
3.3.4 ActivatorUtilities .... 96
3.4 擴展...... 101
3.4.1 適配 ..... 101
3.4.2 IServiceProviderFactory<TContainerBuilder> ... 102
3.4.3 整合第三方依賴注入框架 ... 102
第 4 章 文件系統 ..... 107
4.1 抽象的文件系統 ..... 107
4.1.1 樹形層次結構 .... 107
4.1.2 讀取文件內容 .... 109
4.1.3 監控文件的變化 .... 111
4.2 文件與目錄 ...... 112
4.2.1 IChangeToken ..... 113
4.2.2 IFileProvider ..... 114
4.2.3 兩個特殊的文件系統 ..... 116
4.3 物理文件系統 ...... 119
4.3.1 PhysicalFileInfo .... 119
4.3.2 PhysicalDirectoryInfo ..... 120
4.3.3 PhysicalDirectoryContents .... 120
4.3.4 NotFoundDirectoryContents ... 121
4.3.5 PhysicalFilesWatcher .... 121
4.4 內嵌文件系統 ...... 123
4.4.1 將項目文件變成內嵌資源 ... 123
4.4.2 讀取資源文件 .... 124
4.4.3 EmbeddedFileProvider .... 125
第 5 章 配置選項(上) ..... 128
5.1 讀取配置信息 ...... 128
5.1.1 編程模型三要素 .... 128
5.1.2 以“鍵-值”對的形式讀取配置 .... 129
5.1.3 讀取結構化的配置 .... 130
5.1.4 將結構化配置直接綁定為對象 .... 133
5.1.5 將配置定義在文件中 ..... 133
5.1.6 根據環境動態加載配置文件 ... 134
5.1.7 配置內容的同步 .... 136
5.2 配置模型 ...... 137
5.2.1 數據結構及其轉換 ..... 137
5.2.2 IConfiguration .... 138
5.2.3 IConfigurationProvider ..... 140
5.2.4 IConfigurationSource .... 142
5.2.5 IConfigurationBuilder ..... 143
5.2.6 ConfigurationManager .... 143
5.3 配置綁定 ...... 144
5.3.1 綁定配置項的值 .... 145
5.3.2 綁定復合對象 .... 147
5.3.3 綁定集合 .... 149
5.3.4 綁定字典 .... 151
5.4 配置的同步 ...... 152
5.4.1 配置數據流 .... 152
5.4.2 ConfigurationReloadToken .... 153
5.4.3 ConfigurationRoot .... 153
5.4.4 ConfigurationSection .... 156
5.5 多樣性的配置源 ..... 157
5.5.1 MemoryConfigurationSource .... 157
5.5.2 EnvironmentVariablesConfigurationSource ... 158
5.5.3 CommandLineConfigurationSource .... 160
5.5.4 FileConfigurationSource ..... 163
5.5.5 StreamConfigurationSource .... 173
5.5.6 ChainedConfigurationSource ... 175
第 6 章 配置選項(下) ..... 177
6.1 Options 模式 ..... 177
6.1.1 將配置綁定為 Options 對象 ... 177
6.1.2 提供具名的 Options ..... 179
6.1.3 配置源的同步 .... 180
6.1.4 直接初始化 Options 對象 ..... 182
6.1.5 根據依賴服務的 Options 設置 ... 184
6.1.6 驗證 Options 的有效性 .... 186
6.2 Options 模型 ..... 187
6.2.1 OptionsManager<TOptions> ... 187
6.2.2 IOptionsFactory<TOptions> ... 189
6.2.3 IOptionsMonitorCache<TOptions> ... 197
6.2.4 IOptionsMonitor<TOptions> ... 198
6.3 依賴注入 ...... 200
6.3.1 服務注冊 .... 200
6.3.2 IOptions<TOptions>與 IOptionsSnapshot<TOptions> ... 206
6.3.3 集成配置系統 .... 208
第 7 章 診斷日志(上) ..... 210
7.1 各種診斷日志形式 ..... 210
7.1.1 調試日志 .... 210
7.1.2 跟蹤日志 .... 211
7.1.3 事件日志 .... 213
7.1.4 診斷日志 .... 216
7.2 Debugger 調試日志 .... 219
7.2.1 Debugger .... 220
7.2.2 Debug ..... 221
7.3 TraceSource 跟蹤日志 .... 222
7.3.1 跟蹤日志模型三要素 ..... 222
7.3.2 預定義 TraceListener .... 231
7.3.3 Trace ...... 235
7.4 EventSource 事件日志 .... 237
7.4.1 EventSource ..... 237
7.4.2 EventListener .... 243
7.4.3 活動跟蹤 .... 247
7.5 DiagnosticSource 診斷日志 .... 251
7.5.1 標準的觀察者模式 .... 251
7.5.2 AnonymousObserver<T> .... 253
7.5.3 強類型的日志事件訂閱 ..... 256
7.5.4 針對活動的跟蹤 .... 258
第 8 章 診斷日志(中) ..... 260
8.1 統一日志編程模式 ..... 260
8.1.1 日志輸出 .... 260
8.1.2 日志過濾 .... 265
8.1.3 日志范圍 .... 271
8.1.4 LoggerMessage ..... 273
8.2 日志模型詳解 ...... 274
8.2.1 日志模型三要素 .... 274
8.2.2 ILogger ..... 275
8.2.3 ILoggerProvider .... 277
8.2.4 ILoggerFactory ..... 277
8.2.5 LoggerMessage ..... 281
8.3 日志范圍 ...... 283
8.3.1 調用鏈跟蹤 .... 283
8.3.2 服務范圍堆棧 .... 294
8.3.3 Activity 的應用 .... 296
8.4 依賴注入 ...... 297
8.4.1 核心服務 .... 298
8.4.2 配置 ..... 300
8.4.3 日志過濾規則 .... 303
第 9 章 診斷日志(下) ..... 306
9.1 控制臺 ...... 306
9.1.1 ConsoleFormatter .... 306
9.1.2 ConsoleLogger .... 313
9.1.3 ConsoleLoggerProvider ..... 315
9.1.4 服務注冊 .... 316
9.2 調試器 ...... 321
9.2.1 DebugLogger .... 322
9.2.2 DebugLoggerProvider ..... 323
9.3 TraceSource 日志 .... 323
9.3.1 TraceSourceLogger ..... 323
9.3.2 TraceSourceLoggerProvider .... 325
9.4 EventSource 日志 ..... 327
9.4.1 LoggingEventSource ..... 327
9.4.2 EventSourceLogger..... 328
9.4.3 EventSourceLoggerProvider ... 332
9.4.4 日志范圍 .... 334
第 10 章 對象池 ..... 338
10.1 利用對象池復用對象 ..... 338
10.1.1 對象的“借”與“還” ..... 338
10.1.2 依賴注入 .... 340
10.1.3 池化對象策略 .... 340
10.1.4 對象池的大小 .... 341
10.1.5 對象的釋放 .... 344
10.2 池化對象管理 ...... 345
10.2.1 IPooledObjectPolicy<T> ..... 345
10.2.2 ObjectPool<T> ..... 346
10.2.3 ObjectPoolProvider ..... 351
10.3 擴展應用 ...... 352
10.3.1 池化集合 .... 352
10.3.2 池化 StringBuilder .... 354
10.3.3 ArrayPool<T> ..... 356
10.3.4 MemoryPool<T> .... 357
第 11 章 緩存 ..... 359
11.1 將數據緩存起來 ..... 359
11.1.1 將數據緩存在內存中 ..... 359
11.1.2 將數據緩存在 Redis 中 .... 360
11.1.3 將數據緩存在 SQL Server 中 ... 363
11.2 本地內存緩存 ..... 365
11.2.1 ICacheEntry .... 365
11.2.2 MemoryCacheEntryOptions .... 368
11.2.3 IMemoryCache ..... 369
11.3 分布式緩存 ...... 378
11.3.1 IDistributedCache ..... 378
11.3.2 Redis 緩存 .... 379
11.3.3 SQL Server 緩存 ..... 382
第 12 章 HTTP 調用 ..... 385
12.1 HttpClient 的工廠 ..... 385
12.1.1 手動創建 HttpClient ..... 385
12.1.2 使用 IHttpClientFactory 工廠 ... 387
12.1.3 直接注入 HttpClient ..... 387
12.1.4 定制 HttpClient..... 388
12.1.5 強類型客戶端 .... 389
12.1.6 失敗重試 .... 390
12.2 HttpMessageHandler 管道 ..... 391
12.2.1 HttpMessageHandler ..... 391
12.2.2 DelegatingHandler .... 392
12.2.3 診斷日志 .... 396
12.2.4 復用 HttpClientHandler .... 398
12.3 HttpClient 的構建 ..... 400
12.3.1 HttpMessageHandlerBuilder ... 400
12.3.2 HttpClientFactoryOptions ... 401
12.3.3 IHttpMessageHandlerBuilderFilter .... 407
12.3.4 IHttpClientFactory .... 408
12.4 依賴注入 ...... 418
12.4.1 基礎服務注冊 .... 418
12.4.2 定制 HttpClient..... 420
12.4.3 強類型客戶端 .... 424
第 13 章 數據保護 ..... 430
13.1 加密與哈希 ...... 430
13.1.1 數據加密與解密..... 430
13.1.2 設置加密內容的有效期 ..... 433
13.1.3 撤銷密鑰 .... 434
13.1.4 “瞬時”加解密..... 435
13.1.5 密碼哈希 .... 437
13.2 加密模型 ...... 438
13.2.1 IAuthenticatedEncryptor ..... 438
13.2.2 IKey ..... 439
13.2.3 IKeyRing .... 440
13.2.4 IKeyRingProvider ..... 442
13.2.5 IDataProtector ..... 443
13.3 密鑰管理 ...... 452
13.3.1 KeyManagementOptions ..... 452
13.3.2 Key ..... 457
13.3.3 IKeyManager .... 459
13.3.4 KeyRingProvider .... 465
13.4 依賴注入 ...... 472
13.4.1 注冊基礎服務 .... 472
13.4.2 密鑰管理配置 .... 477
13.4.3 擴展配置 .... 478
附錄 A ....... 482
第 3 篇 承載系統
第 14 章 服務承載 ..... 488
14.1 服務承載 ...... 488
14.1.1 性能指標收集服務 ..... 488
14.1.2 依賴注入 .... 490
14.1.3 配置選項 .... 493
14.1.4 承載環境 .... 496
14.1.5 日志 ..... 498
14.2 服務承載模型 ...... 500
14.2.1 IHostedService .... 500
14.2.2 IHost ...... 501
14.2.3 IHostBuilder ..... 506
14.3 服務承載流程 ...... 511
14.3.1 服務宿主 .... 512
14.3.2 服務承載設置 .... 516
14.3.3 創建宿主 .... 521
14.3.4 靜態類型 Host .... 527
第 15 章 應用承載(上) ..... 531
15.1 管道式的請求處理 ..... 531
15.1.1 承載方式的變遷 .... 531
15.1.2 中間件...... 536
15.1.3 定義強類型中間件 ..... 539
15.1.4 按照約定定義中間件 ..... 540
15.2 依賴注入 ...... 542
15.2.1 服務注冊 .... 542
15.2.2 服務注入 .... 544
15.2.3 生命周期 .... 546
15.3 配置 ...... 551
15.3.1 初始化配置 .... 551
15.3.2 以“鍵-值”對形式讀取和修改配置 ... 552
15.3.3 注冊配置源 .... 553
15.4 承載環境 ...... 554
15.4.1 IWebHostEnvironment .... 554
15.4.2 通過配置定制承載環境 ..... 556
15.4.3 設置監聽地址 .... 559
15.4.4 針對環境的編程..... 560
第 16 章 應用承載(中) ..... 564
16.1 中間件委托鏈 ..... 564
16.1.1 HttpContext .... 564
16.1.2 中間件 ...... 565
16.1.3 中間件管道的構建 ..... 566
16.2 服務器 ...... 567
16.2.1 IServer ...... 568
16.2.2 針對服務器的適配 ..... 568
16.2.3 HttpListenerServer .... 570
16.3 承載服務 ...... 573
16.3.1 WebHostedService .... 573
16.3.2 WebHostBuilder .... 573
16.3.3 應用構建 .... 575
第 17 章 應用承載(下) ..... 577
17.1 共享上下文對象 ..... 577
17.1.1 HttpContext .... 577
17.1.2 服務器適配 .... 580
17.1.3 獲取上下文對象 .... 583
17.1.4 上下文對象的創建與釋放 ... 584
17.1.5 RequestServices .... 585
17.2 IServer + IHttpApplication .... 587
17.2.1 IServer ...... 588
17.2.2 HostingApplication ..... 588
17.2.3 診斷日志 .... 591
17.3 中間件委托鏈 ...... 596
17.3.1 IApplicationBuilder .... 596
17.3.2 弱類型中間件 .... 599
17.3.3 強類型中間件 .... 602
17.3.4 注冊中間件 .... 604
17.4 應用的承載 ...... 604
17.4.1 GenericWebHostServiceOptions .... 604
17.4.2 GenericWebHostService .... 607
17.4.3 GenericWebHostBuilder .... 609
17.4.4 ConfigureWebHostDefaults ... 617
17.5 Minimal API ..... 619
17.5.1 WebApplication .... 620
17.5.2 WebApplication 的創建 .... 622
17.5.3 工廠方法 .... 631
第 4 篇 服務器概述
第 18 章 服務器 ..... 634
18.1 自定義服務器 ...... 634
18.1.1 IServer ...... 634
18.1.2 請求和響應特性 .... 637
18.1.3 StreamBodyFeature ..... 638
18.1.4 HttpListenerServer .... 638
18.2 KestrelServer ...... 642
18.2.1 注冊終節點 .... 642
18.2.2 限制約束 .... 652
18.2.3 其他設置 .... 655
18.2.4 設計與實現 .... 655
18.3 HTTP.SYS ...... 668
18.3.1 HTTP.SYS 簡介 .... 668
18.3.2 UseHttpSys ..... 669
18.3.3 HttpSysOptions ..... 669
18.4 IIS ..... 672
18.4.1 ASP.NET Core Module ..... 672
18.4.2 In-Process 部署模式 ..... 672
18.4.3 Out-of-Process 部署模式 .... 675
18.4.4 <aspnetcore>配置 ..... 678
第 5 篇 中間件
第 19 章 靜態文件 ..... 682
19.1 搭建文件服務器 ..... 682
19.1.1 發布物理文件 .... 682
19.1.2 呈現目錄結構 .... 684
19.1.3 顯示默認頁面 .... 685
19.1.4 映射媒體類型 .... 688
19.2 處理文件請求 ..... 690
19.2.1 條件請求 .... 690
19.2.2 區間請求 .... 694
19.2.3 StaticFileMiddleware .... 696
19.3 處理目錄請求 ..... 700
19.3.1 DirectoryBrowserMiddleware ... 700
19.3.2 DefaultFilesMiddleware .... 704
第 20 章 路由 ..... 708
20.1 路由映射 ...... 708
20.1.1 注冊終節點 .... 708
20.1.2 設置內聯約束 .... 711
20.1.3 可缺省路由參數..... 712
20.1.4 特殊的路由參數..... 713
20.1.5 主機名綁定 .... 715
20.1.6 更加自由的定義方式 ..... 716
20.2 路由分發 ...... 717
20.2.1 路由模式 .... 717
20.2.2 路由終節點 .... 722
20.2.3 中間件...... 730
20.2.4 處理器適配 .... 737
20.2.5 Minimal API ..... 746
20.3 路由約束 ...... 748
20.3.1 預定義的 IRouteConstraint ... 749
20.3.2 IInlineConstraintResolver .... 750
20.3.3 自定義約束 .... 750
第 21 章 異常處理 ..... 753
21.1 呈現錯誤信息 ...... 753
21.1.1 開發者異常頁面 .... 753
21.1.2 定制異常頁面 .... 756
21.1.3 針對響應狀態碼定制錯誤頁面 .... 757
21.2 開發者異常頁面 ..... 759
21.2.1 IDeveloperPageExceptionFilter ... 759
21.2.2 顯示編譯異常信息 ..... 760
21.2.3 DeveloperExceptionPageMiddleware .... 764
21.3 異常處理器 ...... 766
21.3.1 ExceptionHandlerMiddleware ... 766
21.3.2 IExceptionHandlerPathFeature 特性 ... 768
21.3.3 清除緩存 .... 771
21.3.4 404 響應 ..... 772
21.4 響應狀態碼頁面 ..... 774
21.4.1 StatusCodePagesMiddleware... 774
21.4.2 阻止處理異常 .... 775
21.4.3 注冊中間件 .... 777
第 22 章 響應緩存 ..... 783
22.1 緩存響應內容 ...... 783
22.1.1 基于路徑的響應緩存 ..... 783
22.1.2 引入其他緩存維度 ..... 785
22.1.3 緩存屏蔽 .... 790
22.2 HTTP-Cache ..... 791
22.2.1 私有緩存和共享緩存 ..... 792
22.2.2 響應的提取 .... 792
22.2.3 新鮮度檢驗 .... 793
22.2.4 顯式緩存控制 .... 794
22.3 中間件 ...... 795
22.3.1 緩存上下文對象..... 795
22.3.2 緩存策略 .... 796
22.3.3 緩存鍵 ...... 797
22.3.4 緩存的讀/寫 ..... 798
22.3.5 ResponseCachingMiddleware .... 799
22.3.6 注冊中間件 .... 801
第 23 章 會話 ..... 803
23.1 利用會話保留“語境” ..... 803
23.1.1 設置和提取會話狀態 ..... 803
23.1.2 查看存儲的會話狀態 ..... 805
23.1.3 查看 Cookie .... 807
23.2 會話狀態的讀/寫 .... 807
23.2.1 ISession .... 808
23.2.2 DistributedSession .... 809
23.2.3 ISessionStore .... 810
23.3 會話中間件 ...... 811
23.3.1 SessionOptions ..... 811
23.3.2 ISessionFeature ..... 812
23.3.3 SessionMiddleware ..... 812
第 24 章 HTTPS 策略 ..... 815
24.1 HTTPS 終節點的切換 .... 815
24.1.1 構建 HTTPS 站點 .... 815
24.1.2 HTTPS 重定向 ..... 818
24.1.3 瀏覽器自動重定向 ..... 819
24.1.4 HSTS 選項配置 .... 821
24.2 HTTPS 重定向 ..... 823
24.2.1 HttpsRedirectionOptions ..... 823
24.2.2 HttpsRedirectionMiddleware 中間件 .... 824
24.2.3 中間件注冊 .... 826
24.3 HSTS ...... 827
24.3.1 HstsOptions .... 827
24.3.2 HstsMiddleware 中間件 .... 828
24.3.3 中間件注冊 .... 829
第 25 章 重定向 ..... 830
25.1 基于規則的重定向 ..... 830
25.1.1 客戶端重定向 .... 830
25.1.2 服務端重定向 .... 831
25.1.3 IIS 重寫規則 .... 832
25.1.4 Apache 重寫規則 .... 834
25.1.5 HTTPS 重定向 ..... 836
25.2 重定向中間件 ...... 838
25.2.1 重定向規則 .... 838
25.2.2 RewriteMiddleware ..... 839
25.3 預定義規則 ...... 841
25.3.1 “萬能”規則 .... 841
25.3.2 客戶端重定向 .... 842
25.3.3 服務端重定向 .... 843
25.3.4 WWW 重定向 .... 843
25.3.5 HTTPS 重定向 ..... 845
25.3.6 IIS 重寫規則 .... 846
25.3.7 Apache 重寫規則 ..... 848
第 26 章 限流..... 850
26.1 控制并發量 ...... 850
26.1.1 設置并發和等待請求閾值 ... 850
26.1.2 初識基于隊列的處理策略 ... 853
26.1.3 初識基于棧的處理策略 ..... 855
26.2 并發限制中間件 ..... 856
26.2.1 等待隊列策略 .... 856
26.2.2 ConcurrencyLimiterMiddleware .... 856
26.2.3 處理拒絕請求 .... 858
26.3 等待隊列策略 ..... 859
26.3.1 基于隊列的處理策略 ..... 859
26.3.2 基于棧的處理策略 ..... 861
第 27 章 認證 ..... 867
27.1 認證、登錄與注銷 ..... 867
27.1.1 認證票據 .... 867
27.1.2 基于 Cookie 的認證 ..... 868
27.1.3 強制認證 .... 871
27.1.4 登錄與注銷 .... 871
27.2 身份與用戶 ...... 872
27.2.1 IIdentity .... 872
27.2.2 IPrincipal .... 877
27.3 認證模型 ...... 880
27.3.1 認證票據詳細介紹 ..... 880
27.3.2 認證處理器 .... 883
27.3.3 認證服務 .... 889
27.3.4 服務注冊 .... 893
27.3.5 AuthenticationMiddleware .... 896
27.4 Cookie 認證方案 .... 898
27.4.1 AuthenticationHandler<TOptions> .... 898
27.4.2 CookieAuthenticationHandler ... 903
27.4.3 注冊 CookieAuthenticationHandler ... 912
第 28 章 授權 ..... 915
28.1 基于“角色”的授權 ..... 915
28.1.1 基于“要求”的授權 ..... 915
28.1.2 預定義授權策略..... 919
28.1.3 基于終節點的自動化授權 ... 921
28.2 基于“要求”的授權 ..... 922
28.2.1 IAuthorizationHandler .... 922
28.2.2 預定義授權處理器 ..... 924
28.2.3 授權檢驗 .... 928
28.3 基于“策略”的授權 ..... 933
28.3.1 授權策略的構建 .... 934
28.3.2 授權策略的注冊 .... 935
28.3.3 授權檢驗 .... 936
28.4 授權與路由 ...... 937
28.4.1 IAuthorizeData ..... 937
28.4.2 IAllowAnonymous .... 939
28.4.3 IPolicyEvaluator ..... 940
28.4.4 IAuthorizationMiddlewareResultHandler .... 943
28.4.5 AuthorizationMiddleware .... 944
第 29 章 跨域資源共享 ..... 947
29.1 處理跨域資源 ...... 947
29.1.1 跨域調用 API ..... 947
29.1.2 提供者顯式授權 .... 950
29.1.3 基于策略的資源授權 ..... 951
29.1.4 將 CORS 策略應用到路由上 ... 952
29.2 CORS 規范 ..... 953
29.2.1 同源策略 .... 953
29.2.2 針對資源的授權 .... 954
29.2.3 獲取授權的方式 .... 955
29.2.4 用戶憑證 .... 958
29.3 CORS 中間件 ..... 958
29.3.1 CORS 策略 .... 958
29.3.2 CORS 與路由 ..... 961
29.3.3 CORS 授權 .... 962
29.3.4 CorsMiddleware ..... 964
第 30 章 健康檢查 ..... 968
30.1 檢查應用的健康狀況 ..... 968
30.1.1 確定當前應用是否可用 ..... 968
30.1.2 定制健康檢查邏輯 ..... 969
30.1.3 改變響應狀態碼..... 970
30.1.4 細粒度的健康檢查 ..... 972
30.1.5 定制響應內容 .... 973
30.1.6 過濾 IHealthCheck 對象 ..... 975
30.2 設計與實現 ...... 975
30.2.1 IHealthCheck .... 976
30.2.2 HealthCheckService .... 981
30.2.3 HealthCheckMiddleware ..... 984
30.3 發布健康報告 ..... 989
30.3.1 定期發布健康報告 ..... 989
30.3.2 IHealthCheckPublisher .... 990
30.3.3 HealthCheckPublisherHostedService ... 991
本書主要介紹ASP.NET Core框架最核心的部分,即由一個服務器和若干中間件構建的管道。本書共分為5篇:"第1篇 初識編程(第1章)”列舉一系列極簡的實例為讀者提供基本的編程體驗,"第2 篇 基礎框架(第2~13章)”主要介紹了一系列支撐ASP.NET Core的基礎框架,"第3篇 承載系統(第14~17章)”主要介紹了ASP.NET Core應用的承載流程,"第4篇 服務器概述(第18章)”列舉一系列常見的服務器類型并對它們進行了比較,"第5 篇 中間件(第19~30章)”系統地介紹了一系列預定義的中間件。
寫作源起
.NET Core 的發展印證了那句老話 “合久必分,分久必合”。 .NET 的誕生可以追溯到 1999 年,那年微軟正式啟動 .NET 項目。大約六七年前,當 .NET 似乎快要走到盡頭時,.NET Core 作為一個分支被獨立出來。經過了 3 個主要版本的迭代,.NET Core 儼然已經長成一棵參天大樹。
隨著 .NET 5 的推出,.NET Framework 和 .NET Core 又重新被整合到一起。與其說 .NET Core 重新回到了 .NET 的懷抱,還不如說 .NET Core “收編”了原來的“殘余勢力”,自己成為“正統”。
一統江湖的 .NET 5 的根基,在下一個版本( .NET 6)中得到了進一步鞏固,今后的 .NET Core 將以每年更新一個版本的節奏穩步向前推進。
目前,還沒有哪個技術平臺像 .NET Core 這樣提供了如此完備的技術棧,桌面、Web、云、移動、游戲、IoT 和 AI 相關開發都可以在這個平臺上完成。在列出的這七大領域中,面向應用的Web 開發依然占據了市場的半壁江山,為其提供支撐的 ASP.NET Core 的重要性就毋庸置疑了。
Web 應用可以采用不同的開發模式,如 MVC、gRPC、Actor Model、GraphQL、Pub/Sub 等,它們都有對應的開發框架予以支持。雖然編程模式千差萬別,開發框架也琳瑯滿目,但是底層都需要解決一個核心問題,那就是請求的接收、處理和響應,而這個基礎功能就是在 ASP.NET Core 中實現的。從這個角度來講,ASP.NET Core 是介于 .NET 基礎框架和各種 Web 開發框架之間的中間框架。
在前 .NET 時代( .NET Core 誕生之前),計算機圖書市場存在一系列介紹 ASP.NET Web Forms、ASP.NET MVC、ASP.NET Web API 的圖書。但是找不到一本專門介紹 ASP.NET 自身框架的圖書。作為一名擁有近 20 年工作經驗的 .NET 開發者,我對此感到十分困惑。上述這些Web 開發框架都是建立在 ASP.NET 框架之上的,底層的 ASP.NET 框架才是根基所在。過去我接觸過很多資深的 ASP.NET 開發人員,發現他們對 ASP.NET 框架都沒有進行更深入的了解。
2014 年,出版《ASP.NET MVC 5 框架揭秘》之后,我原本打算撰寫《ASP.NET 框架揭秘》。后I來.NET Core 橫空出世,我的研究方向也隨之轉移,于是就有了在 2019 年出版的《ASP.NET Core 3 框架揭秘》。
在 .NET 5 發布之前,我準備將這本書進行相應的升級。按照微軟公布的版本差異,我覺得升級到《ASP.NET 5 框架揭秘》應該不會花費太多時間和精力,但后來的事實證明我的想法太天真了。由于這本書主要介紹的是 ASP.NET 框架的內部設計和實現,版本之間涉及的很多變化并未“記錄在案”,只能通過閱讀源代碼的方式去發掘。本著寧缺毋濫的原則,我放棄了撰寫《ASP.NET 5 框架揭秘》。現在看來這是一個明智的決定,因為 ASP.NET Core 6 是穩定的長期支持版本。另外,我也有了相對充裕的時間逐個確認書中涉及的每個特性在新版本中是否發生了變化,并進行了相應的修改,刪除陳舊的內容,添加新的特性。
對于升級后的《ASP.NET Core 6 框架揭秘》,一個全局的改動就是全面切換到基于 Minimal API 的編程模式上。升級后的版本添加了一系列新的章節,如“第 10 章 對象池”“第 12 章 HTTP 調用”“第 13 章 數據保護”“第 18 章 服務器”“第 24 章 HTTPS 策略”“第 25 章 重定向”“第 26 章 限流”等。由于篇幅的限制,不得不刪除一些“不那么重要”的章節。
本書內容
《ASP.NET Core 6 框架揭秘》只關注 ASP.NET Core 框架最核心的部分,即由一個服務器和若干中間件構建的管道,除了“第 1 章 編程體驗”,其他章節基本上都不會涉及上層的編程框架。本書共分為以下 5 篇內容。
● 初始編程
第 1 章提供了 20 個極簡的 Hello World 應用程序,帶領讀者感受一下 ASP.NET Core 的編程體驗。這些演示實例涉及基于命令行的應用創建和 Minimal API 的編程模式,還涉及多種中間件的定義及配置選項和診斷日志的應用。第 1 章還演示了如何利用路由、MVC 和 gRPC 開發 Web 應用和 API,4 種針對 Dapr 的應用開發模型也包含在這 20 個演示實例中。
● 基礎框架
ASP.NET Core 建立在一系列基礎框架之上,這些獨立的框架在日常的應用開發中同樣被廣泛地使用。第 2 篇提供的若干章節對這些基礎框架進行了系統而詳細的介紹,其中包括“第 2~3 章 依賴注入”“第 4 章 文件系統”“第 5~6 章 配置選項”“第 7~9 章 診斷日志”“第 10 章 對象池”“第 11 章 緩存”“第 12 章 HTTP 調用”“第 13 章 數據保護”。
● 承載系統
ASP.NET Core 應用作為一個后臺服務寄宿于服務承載系統中,“第 14 章 服務承載”主要對該承載系統進行了詳細介紹。ASP.NET Core 應用的承載是本書最核心的部分,“第 15~17 章 應用承載(上、中、下)”不僅對 ASP.NET Core 請求處理管道的構建和應用承載的內部流程進行了詳細介紹,還對 Minimal API 的編程模型和底層的實現原理進行了詳細介紹。
● 服務器概述
本書所有內容都圍繞著 ASP.NET Core 請求處理管道,該管道由一個服務器和若干中間件構建。第 18 章主要對服務器的系統進行了介紹,不僅會詳細介紹 Kestrel 服務器的使用和實現原理,還會介紹基于 IIS 的兩種部署模式和 HTTP.SYS 的使用,以及如何自定義服務器類型。
● 中間件
服務器接收的請求會分發給中間件管道進行處理。本篇對大部分中間件的使用和實現原理進行了介紹,其中包括“第 19 章 靜態文件”“第 20 章 路由”“第 21 章 異常處理”“第 22 章 響應緩存”“第 23 章 會話”“第 24 章 HTTPS 策略”“第 25 章 重定向”“第 26 章 限流”“第 27 章 認證”“第 28 章 授權”“第 29 章 跨域資源共享”“第 30 章 健康檢查”。
寫作特點
《ASP.NET Core 6 框架揭秘》是揭秘系列的第 6 本書。在這之前,我得到了很多熱心讀者的反饋,這些反饋對書中的內容基本上都持正面評價,但對寫作技巧和表達方式的評價則不盡相同。
每個作者都有屬于自己的寫作風格,而每個讀者的學習思維方式也不盡相同,兩者很難出現百分之百的契合,但我還是決定在《ASP.NET Core 3 框架揭秘》的基礎上對后續作品進行修改。從收到的反饋意見來看,這一改變得到了讀者的認可,所以《ASP.NET Core 6 框架揭秘》沿用了這樣的寫作方式。
本書的寫作風格可以概括為“體驗先行、設計貫通、應用擴展”12 個字。大部分章節開頭都會提供一些簡單的演示實例,旨在讓讀者對 ASP.NET Core 的基本功能特性和編程模式有一個大致的了解。在此之后,我會提供背后的故事,即編程模型的設計和原理。將開頭實例和架構設計融會貫通之后,讀者基本上能夠將學到的知識正確地應用到事件中,對應章節對此會提供一些最佳實踐。秉承“對擴展開放,對改變關閉”的“開閉原則”,每個功能模塊都提供了相應的擴展點,能夠精準地找到并運用適合的擴展來解決真實項目開發中的問題才是終極的目標,對應章節會介紹可用的擴展點,并提供一些解決方案和演示實例。
本書綜合運用“文字”“圖表”“編程”這 3 種不同的“語言”來介紹每個技術主題。一圖勝千言,每章都精心設計了很多圖表,這些具象的圖表能夠幫助讀者理解技術模塊的總體設計、執行流程和交互方式。除了利用編程語言描述應用編程接口(API),本書還提供了 200 多個實例,這些實例具有不同的作用,有的是為了演示某個實用的編程技巧或者最佳實踐,有的是為了強調一些容易忽視但很重要的技術細節,有的是為了探測和證明所述的論點。
本書在很多地方展示了一些類型的代碼,但是絕大部分代碼和真正的源代碼是有差異的,兩者的差異有以下幾個原因:第一,源代碼在版本更替中一直在發生改變;第二,由于篇幅的限制,刪除了一些細枝末節的代碼,如針對參數的驗證、診斷日志的輸出和異常處理等;第三,很多源代碼其實都具有優化的空間。本書提供的代碼片段旨在揭示設計原理和實現邏輯,不是為了向讀者展示源代碼。
目標讀者
雖然本書關注的是 ASP.NET Core 自身框架提供的請求處理管道,而不是具體某個應用編程框架,但是本書適合大多數 .NET 技術從業人員閱讀。任何好的設計都應該是簡單的,唯有簡單的設計才能應對后續版本更替中出現的復雜問題。ASP.NET Core 框架就是好的設計,因為自正式推出的那一刻起,該框架的總體設計基本上沒有發生改變。既然設計是簡單的,對大部分從業人員來說,對框架的學習也就沒有什么門檻。本書采用漸進式的寫作方式,對于完全沒有接觸過 ASP.NET Core 的開發人員也可以通過學習本書內容深入、系統地掌握這門技術。由于本書提供的大部分內容都是獨一無二的,即使是資深的 .NET 開發人員,也能在書中找到很多不甚了解的盲點。
pagetop