前言
✤ 寫作源起
電腦圖書市場存在一系列介紹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 的每次版本升級,筆者基本上會盡可能將書中的內容做對應的更改,但其中難免有所疏漏。由於筆者的能力和時間有限,書中難免存在不足之處,懇請讀者們批評指正。
筆者部落格:www.cnblogs.com/artech
筆者微博:www.weibo.com/artech
筆者電子郵件:jinnan@outlook.com
筆者微信公眾號:大內老A