ASP.NET Core 6框架揭秘(上下冊)( 簡體 字) | |
作者:蔣金楠 | 類別:1. -> 程式設計 -> .NET -> ASP.NET |
出版社:電子工業出版社 | 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 開發人員,也能在書中找到很多不甚了解的盲點。 |