前言
✤ 寫作源起
電腦圖書市場存在一係列介紹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