描述
本書特色
► 可在Windows、macOS、Linux平台上開發.NET Core應用,也可以透過Docker容器部署ASP.NET Core
► 植入架構、請求處理管線等建立ASP.NET Core應用的基本程式設計模式,依賴植入原理及架構的設計與程式設計方式完整介紹
► 抽象的檔案系統,包括物理檔案系統和程式集內嵌檔案系統
► 介紹支援多種資料來源的設定系統;採用Options模式來讀取設定選項
► 介紹5種常用的記錄診斷記錄檔的方式及多種輸出通道的記錄檔系統
► 承載系統以及從程式設計模型的角度來認識管線
► 提供一個極簡版的模擬架構來展示ASP.NET Core架構真實的管線
► 針對請求的處理則表現在有序排列的中介軟體上,包括處理檔案請求、路由、例外的中介軟體,也包含用來回應快取和階段的中介軟體
► 詳細說明認證、授權、跨域資源分享等安全相關的中介軟體
► 介紹當地語系化、健康檢查的中介軟體。除此之外,亦包含實現主機名稱過濾、HTTP重新定義、設定基礎路徑等功能的中介軟體
本書重點
ASP.NET Core是一個全新的Web開發平台,作為核心的Web開發平台,ASP.NET Core可利用其極具擴展能力的請求處理管線,來支撐目前常用的開發模型,如MVC、GRPC、SingalR和Orleans等。不論從事哪種類型的Web開發,甚至可以在ASP.NET Core平台上構建自己的Web程式設計模型。
本書主要內容
全書主要劃分為以下4部分:
► 跨平台的開發體驗和實現原理
01 透過Hello World程式,讓讀者體驗在Windows、macOS、Linux平台上開發.NET Core應用,以及透過Docker容器部署ASP.NET Core應用的樂趣
02 告訴讀者.NET Core的跨平台是如何實現的
► 基礎架構
03、04 對依賴植入原理及依賴植入架構的設計與程式設計方式進行介紹
05 對檔案系統的設計模型和兩種實現方式(物理檔案系統和程式集內嵌檔案系統)進行介紹。
06 介紹支援多種資料來源的設定系統項
07 說明強類型的設定選項程式設計方式
08 介紹5種常用記錄診斷記錄檔的方式
09 介紹.NET Core提供支援多種輸出通道的記錄檔系統
► 管線詳解
10 介紹.NET Core的服務承載系統。
11 從程式設計模型的角度來認識管線
12 提供一個極簡版的模擬架構展示ASP.NET Core架構的整體設計
13 以模擬架構為基礎,展現ASP.NET Core架構真實的管線
► 中介軟體
14、15;16、17、18、19、20、21
處理檔案請求、路由、例外的中介軟體,也包含用來回應快取和階段的中介軟體,還包含用來實現認證、授權、跨域資源分享等與安全相關的中介軟體
22介紹針對當地語系化的中介軟體
23 介紹健康檢查的中介軟體
24 介紹用來實現主機名稱過濾、HTTP重新定義、設定基礎路徑等功能的中介軟體
適合讀者群 沒有接觸過ASP.NET Core的開發人員、資深的.NET開發設計人員、所有.NET技術從業人員。
作者簡介
蔣金楠
知名IT博主(長踞博客園排名第一),擁有個人微信公眾號「大內老A」。連續12次被評為微軟MVP(最有價值專家),也是少數跨多領域的MVP(Solutions Architect、Connected System、Microsoft Integration和ASP.NET/IIS等),暢銷IT圖書作者。
目錄
前言
01全新的開發體驗
1.1 Windows 平台
1.2 macOS 使用者
1.3 Linux
1.4 Docker
02 跨平台的奧秘
2.1 歷史的枷鎖
2.2 重複使用之傷
2.3 全新的版面配置
03 依賴植入(上篇)
3.1 控制反轉
3.2 IoC 模式
3.3 依賴植入
3.4 一個簡易版的依賴植入容器
04 依賴植入(下篇)
4.1 利用容器提供服務
4.2 服務註冊
4.3 服務的消費
4.4 實現概覽
4.5 擴充
05 檔案系統
5.1 抽象的檔案系統
5.2 設計詳解
5.3 遠端檔案系統
06 設定選項(上篇)
6.1 讀取設定資訊
6.2 設定模型
6.3 設定綁定
6.4 設定的同步
6.5 多樣性的設定來源 3
07 設定選項(下篇)
7.1 Options 模式
7.2 Options 模型
7.3 依賴植入
08 診斷記錄檔(上篇)
8.1 各種診斷記錄檔形式
8.2 Debugger 偵錯記錄檔
8.3 TraceSource 追蹤記錄檔
8.4 EventSource 事件記錄檔
8.5 DiagnosticSource 診斷記錄檔
09 診斷記錄檔(下篇)
9.1 統一記錄檔程式設計模式
9.2 記錄檔模型詳解
9.3 依賴植入
9.4 記錄檔輸出通道
10 承載系統
10.1 服務承載
10.2 承載模型
10.3 實現原理
11 管線(上篇)
11.1 管線式的請求處理
11.2 依賴植入
11.3 設定
11.4 承載環境
11.5 初始化
12 管線(中篇)
12.1 中介軟體委派鏈
12.2 伺服器
12.3 承載服務
13 管線(下篇)
13.1 請求上下文
13.2 IServer + IHttpApplication
13.3 中介軟體委派鏈
13.4 應用的承載
14 靜態檔案
14.1 架設檔案伺服器
14.2 處理檔案請求
14.3 處理目錄請求
15 路由
15.1 路由對映
15.2 終節點的解析與執行
15.3 路由約束
16 例外處理
16.1 呈現錯誤訊息
16.2 開發者例外頁面
16.3 例外處理器
16.4 回應狀態碼頁面
17 快取
17.1 將資料快取起來
17.2 本機記憶體快取
17.3 分散式快取
17.4 回應快取
18 階段
18.1 利用階段保留「語境」
18.2 階段狀態的讀寫
18.3 SessionMiddleware 中介軟體
19 認證
19.1 認證、登入與登出
19.2 身份與使用者
19.3 認證模型
19.4 Cookie 認證方案
20 授權
20.1 以角色為基礎的許可權控制
20.2 以「要求」為基礎的授權
20.3 以「策略」為基礎的授權
21 跨域資源分享
21.1 處理跨域資源
21.2 CORS 標準
21.3 CORS 模型
22 當地語系化
22.1 提供當地語系化訊息文字
22.2 文字當地語系化
22.3 目前語言文化的設定
23 健康檢查
23.1 檢查應用的健康狀況
23.2 設計與實現
23.3 發佈健康報告
24 補遺
24.1 過濾主機名稱
24.2 HTTP 重新定義
24.3 基礎路徑
24.4 路由
A 實例示範
序
前言
✤ 寫作源起
電腦圖書市場存在一系列介紹ASP.NET Web Forms、ASP.NET MVC、ASP.NETWeb API 的圖書,但是找不到一本專門介紹ASP.NET 本身架構的圖書,作為一名擁有17 年工作經驗的.NET 開發者,筆者對此感到十分困惑。上述這些Web 開發架構都是建立在ASP.NET 底層架構之上的,底層ASP.NET 架構才是根基所在。過去筆者接觸過很多資深的ASP.NET 開發人員,發現他們對ASP.NET 架構大都沒有進行深入了解。
2014 年,出版《ASP.NET MVC 5 架構揭秘》之後,筆者原本打算寫「ASP.NET 架構揭秘」。但在新書準備過程中,微軟推出了ASP.NET Core(當時被稱為ASP.NET5,還沒有.NET Core 的概念)。所以,筆者將研究重點轉移到ASP.NET Core。
本書耗時5 年左右,筆者投入了大量心血。2015 年年初,筆者開始了本書的寫作,微軟在2016 年6 月正式發佈.NET Core 1.0 時,本書的絕大部分內容就已經完成。隨後,微軟不斷推出新的版本,本書的內容也在不斷快速「反覆運算」中。本書正文部分共計900 多頁,但筆者在寫作過程中刪除的部分不少於這個數字。
有人認為自己每天只是做一些簡單的程式設計工作,根本沒有必要去了解底層原理和設計方面的內容。其實,不論我們從事何種層次的工作,最根本的目的只有一個——解決問題。解決方案分兩種:一種是「揚湯止沸」,另一種是「釜底抽薪」。看到鍋裡不斷沸騰的水,大多數人會選擇不斷地往鍋裡澆冷水,筆者希望這本書能夠讓讀者看到鍋底熊熊燃燒的薪火。
✤ 本書內容
ASP.NET Core 是一個全新的Web 開發平台,為我們建置了一個可重複使用和可訂製的請求處理管線,微軟在它上面建置了MVC、SignalR、GRPC、Orleans 這樣廣泛使用的Web 架構,我們也可以利用它建置自己的Web 架構(筆者曾經透過ASP.NET Core 建置了一款GraphQL 架構)。本書只關注最本質的東西,即ASP.NETCore 請求處理管線,並不會有關上述這些Web 架構。本書的內容主要劃分為以下4 個部分。
✤ 跨平台的開發體驗和實現原理
.NET Core 與傳統.NET Framework 最大的區別是跨平台,作為開篇入門材料,第1章透過幾個簡單的Hello World 程式,讓讀者可以體驗如何在Windows、macOS、Linux 平台上開發.NET Core 應用,以及透過Docker 容器部署ASP.NET Core 應用的樂趣。第2 章將告訴讀者.NET Core 的跨平台究竟是如何實現的。
✤ 基礎架構
ASP.NET Core 架構依賴於一些基礎架構,其中最重要的是植入架構。由於依賴植入架構不但是建置ASP.NET Core 請求處理管線的基礎,而且依賴植入也是ASP.NET Core 應用的基本程式設計模式,所以本書的第3 章和第4 章對依賴植入原理及依賴植入架構的設計與程式設計方式進行了詳細介紹。
ASP.NET Core 應用具有很多讀取檔案內容的場景,所以它建置了一個抽象的檔案系統,第5 章會對這個檔案系統的設計模型和兩種實現方式(實體檔案系統和程式集內嵌檔案系統)進行詳細介紹。
.NET Core 針對「設定」的支援是傳統.NET 開發人員所不能想像的,所以採用兩章的篇幅對這一主題說明:第6 章旨在介紹支援多種資料來源的設定系統;不論是開發ASP.NET Core 應用還是元件,都可以採用Options 模式來讀取設定選項,第7章會注重說明這種強類型的設定選項程式設計方式。
.NET Core 在錯誤診斷方面為我們提供了多種選擇,第8 章介紹了5 種常用的記錄診斷記錄檔的方式。.NET Core 還提供了一個支援多種輸出通道的記錄檔系統,該記錄檔系統在第9 章進行了詳細的介紹。
✤ 管線詳解
.NET Core 的服務承載系統用來承載那些需要長時間執行的服務,ASP.NET Core 作為最重要的服務類型被承載於該系統中,第10 章會對該服務承載系統進行系統介紹。由於請求處理管線是本書的核心所在,所以採用3 章的篇幅介紹:第11 章主要從程式設計模型的角度來認識管線;第12 章提供了一個極簡版的模擬架構來展示ASP.NET Core 架構的整體設計;第13 章以這個模擬架構為基礎,採用漸進的方式補充一些遺漏的細節,進而將ASP.NET Core 架構真實的管線展現在讀者眼前。
✤ 中介軟體
ASP.NET Core 架構的請求處理管線由伺服器和中介軟體組成,管線利用伺服器來監聽和接收請求,並完成最後對請求的回應,應用針對請求的處理則表現在有序排列的中介軟體上。微軟為我們提供了一系列原生的中介軟體。
這部分有關用來處理檔案請求(第14 章)、路由(第15 章)、例外(第16 章)的中介軟體,也包含用來回應快取(第17 章)和階段(第18 章)的中介軟體,還包含用來實現認證(第19 章)、授權(第20 章)、跨域資源分享(第21 章)等與安全相關的中介軟體。
這部分還介紹了針對當地語系化(第22 章)和健康檢查(第23 章)的中介軟體。除此之外,這部分還介紹了用來實現主機名稱過濾、HTTP 重新定義、設定基礎路徑等功能的中介軟體,這些零散的中介軟體全部在第24 章介紹。
✤ 寫作特點
在過去的十多年裡,筆者獲得了很多熱心讀者的回饋,這些回饋對書中的內容基本上都持正面評價,但對寫作技巧和表達方式的評價則不盡相同。每個作者都有屬於自己的寫作風格,每個讀者的學習思維方式也不盡相同,兩者很難出現百分之百的契合,但筆者還是決定在本書上做出改變。
本書內容採用了不一樣的組織方式,筆者認為這樣的方式更符合系統地學習一種全新技術的「流程」。對每個模組,筆者採用「體驗先行」的原則,提供一些簡單的實例示範,讓讀者對目前模組的基本功能特性和程式設計模式具有大致的了解。同時,在程式設計體驗中取出一些核心物件,並利用它們建置目前模組的抽象模型,讓讀者只要讀懂了這個模型也就了解了目前模組的整體設計。接下來我們從抽象轉向實際,進一步深入介紹抽象模型的實現原理。為了讓讀者能夠在真實專案中靈活自如地運用目前模組,筆者介紹了一些針對應用的擴充和最佳做法。整體來說,本書採用「程式設計體驗」、「整體設計」、「實作方式」和「靈活運用」的流程,讓讀者能循序漸進地學習ASP.NET Core 的每個功能模組。
本書綜合運用3 種不同的「語言」(文字語言、圖表語言和程式語言)來說明每個技術主題。一圖勝千言,筆者在每章都精心設計了很多圖表,這些具象的圖表能夠幫助讀者了解技術模組的整體設計、執行流程和對話模式。除了利用程式語言描述應用程式設計介面(API),本書還提供了近200 個實例,這些實例具有不同的作用,有的是為了示範某個實用的程式設計技巧或最佳做法,有的是為了強調一些容易忽視但很重要的技術細節,有的是為了探測和證明所述的論點。
本書在很多地方會展示一些類型的程式,但是這些程式和真正的原始程式碼是有差異的,兩者的差異緣於以下幾個原因:第一,原始程式碼在版本更替中一直在發生改變;第二,由於篇幅的限制,筆者刻意刪除了一些細枝末節的程式,如針對參數的驗證、診斷記錄檔的輸出和例外處理等;第三,很多原始程式碼其實都具有最佳化的空間。綜上所述,本書提供的程式片段旨在揭示設計原理和實現邏輯,不是為了介紹原始程式碼。
✤ 目標讀者
雖然本書關注的是ASP.NET Core 本身架構提供的請求處理管線,而非實際某個應用程式設計架構(如MVC、SignalR、GRPC 等),但是本書適合所有.NET 技術從業人員閱讀。
筆者認為任何好的設計都應該是簡單的,唯有簡單的設計才能應對後續版本更替中出現的複雜問題。從這個意義上講,ASP.NET 架構就是好的設計。因為自正式推出的那一刻起,ASP.NET 架構的整體設計基本上沒有發生改變。ASP.NET Core 的設計同樣是好的設計,其簡單的管線式設計在未來的版本更替中也不會發生太大的改變,既然是好的設計,它就應該是簡單的。
正如上面所說,本書採用漸進式的寫作方式,那些完全沒有接觸過ASP.NET Core的開發人員也可以透過本書深入、系統地掌握這門技術。由於本書提供的大部分內容都是獨一無二的,即使是資深的.NET 開發設計人員,也能在書中找到很多不甚了解的盲點。
✤ 關於作者
蔣金楠,同程藝龍技術專家。知名IT 博主(多年來一直排名部落格園第一位),擁有個人微信公眾號「大內老A」;2007—2018 年連續12 次被評為微軟MVP(最有價值專家),也是少數跨多領域(Solutions Architect、Connected System、Microsoft Integration 和ASP.NET/IIS 等)的MVP 。
✤ 致謝
本書得以順利出版離不開博文視點張春雨團隊的辛勤努力,他們的專業水準和責任心為本書提供了品質保障。此外,徐妍妍在本撰寫作過程中做了大量的校對工作,在此表示衷心感謝。
✤ 本書支援
由於本書是隨著ASP.NET Core 一起成長起來的,並且隨著ASP.NET Core 的版本更替進行了多次「反覆運算」,所以書中某些內容最初是根據舊版本撰寫的,新版本對應的內容發生改變後對應內容可能沒有及時更新。對於ASP.NET Core 的每次版本升級,筆者基本上會盡可能將書中的內容做對應的更改,但其中難免有所疏漏。由於筆者的能力和時間有限,書中難免存在不足之處,懇請讀者們批評指正。
筆者部落格:http://www.cnblogs.com/artech
筆者微博:http://www.weibo.com/artech
筆者電子郵件:jinnan@outlook.com
筆者微信公眾號:大內老A