開源Web建置強大標準 - ASP.NET Core全端開發立即上手
.NET Core是由微軟開發的一個跨平台、開源的軟體框架。它是.NET Framework的新版本,提供了更好的效能、模組化和跨平台支援。與.NET Framework不同的是,.NET Core是從頭重新設計的,可以在Windows、macOS和Linux上運行。ASP.NET Core以服務容器為核心,可模組化擴充,並且搭配了常用的元件,它經過重新設計和最佳化,在效能和安全性上都有顯著提升。ASP.NET Core提供Razor Pages、MVC、Web API和Blazor等功能,可靈活組合應用於常規Web、微服務、行動後端和物聯網等場景。如果你已經熟悉.NET架構,再轉為開發Web程式,本書再適合不了。
本書適合有.NET或C#基礎的讀者,透過實例快速掌握ASP.NET Core關鍵技術。本書旨在提供一個全面的學習路徑,幫助讀者從初學者進階到能夠應對現代複雜軟體開發挑戰的專家。無論您是正在尋找開始使用.NET Core 技術堆疊的新手,還是希望深入了解其高級功能和最佳實踐的經驗開發者,本書都將為您提供所需的知識和技能。
作者簡介:
周家安
微軟最有價值專家(MVP),擅長.NET及其相關開發技術,專注於探索簡單實用的程式設計學習方法。長期在博客園等技術社區分享程式設計經驗。出版《Go語言入門經典》《精通C#5.0》《C#碼農筆記:從第一行代碼到項目實戰》《Python實戰指南——手把手教你掌握300個精彩案例》等優秀原創科技圖書。
作者序
ASP.NET Core 由微軟官方推出,開放原始程式碼並以社區為主,可以生成執行於Windows、macOS、Linux 等作業系統的新型Web 應用程式。ASP.NET Core並不是ASP.NET 的延續版本,而是經過重新設計和最佳化的框架。由於它是編譯執行的,因此在性能上的優勢明顯。而且,其內部對非同步任務和安全性做了大量整合工作,有些安全功能是預設啟用的,如對跨站漏洞攻擊的防範。經過六七個版本的迭代,ASP.NET Core 已趨向完善,對Web 前端與其他資料存取技術的相容性也得到極大提升。對於常規Web 功能、微服務、行動後端以及物聯網後端等應用場景,ASP.NET Core 都是不錯的選擇。
本書所涉及的內容針對性強,只要讀者具備.NET 或C# 程式設計相關基礎,即可透過本書快速掌握ASP.NET Core 的關鍵技術。本書在每個基礎知識的講解後都會附上專門的範例,方便讀者將學到的知識馬上付諸實踐,加深印象。
ASP.NET Core 配有官方開發工具,並共用.NET SDK 工具。無論讀者使用的是Windows 還是Linux 作業系統,都可以執行dotnet new 命令建立ASP.NET Core 應用專案,或執行dotnet run 命令執行應用程式。
本書推薦使用官方提供的工具撰寫程式。
•Visual Studio:Windows、macOS 使用者均可以使用,簡稱VS。VS 是著名的整合式開發環境,提供從開發、驗證、生成到偵錯和執行的完整支援。除了程式提示功能,還有聯想功能,可以根據程式上下文以及巨量資料整理推斷各種程式部分,極大地提高編碼效率。
•Visual Studio Code: 簡稱VS Code 或VSC。VS Code 是VS 的分支版本,著重程式編輯功能。VS Code 透過安裝擴充支援各種程式語言。理論上,只要擁有足夠的擴充,VS Code 就能撰寫任何程式語言的程式(如C、C++、Python、C#、Java 等)。VS Code 能執行在Windows、Linux 及macOS 等作業系統上,同時也支援ARM 架構,如Raspberry Pi OS。使用時先執行dotnetnew命令建立ASP.NET Core 專案,然後在VS Code 中開啟專案所在目錄即可。
雖然ASP.NET Core 可以細分出Razor Pages、MVC、Web API、Blazor 等專案,但實際上這些功能是可以在同一個專案中實現的。ASP.NET Core 以服務容器為核心,可以元件化擴充。只要向容器註冊服務類型,就能開啟相關的功能,如MVC 與Blazor 功能可以同時啟用(URL 路由不能有衝突)。
本書適合有一定.NET 或C# 基礎的讀者閱讀,也可以作為高等學校或培訓機構的輔助教材。也歡迎想了解ASP.NET Core 的開發人員閱讀本書。
由於編者水準有限,書中難免出現不妥之處,望讀者們不吝批評指正。
本書主要內容
本書深入探討如何利用最新的.NET Core 技術堆疊,從基礎到進階應用全面涵蓋的書籍。旨在幫助讀者掌握現代軟體開發中所需的核心技能和最佳實踐。首先,書籍將從.NET Core 的基本架構入手。讀者將學習到.NET Core 跨平台開發的優勢,以及如何利用.NET Core 的基本工具進行開發。我們將深入探討.NET Core 的核心概念,包括如何建立和組織專案結構,以及如何使用依賴注入和配置服務來管理應用程序的組件。
其次,本書將詳細介紹如何建立高效率的Web應用程式。我們將從設計和實作Web API開始,涵蓋API的路由設計、參數綁定、請求和回應格式化等方面。讀者將學習到如何使用.NET Core 框架提供的工具和技術來開發RESTful API,並探索如何處理身份驗證和授權、輸入驗證、日誌記錄等關鍵問題。除了基本的Web應用程式開發,本書還將深入探討微服務架構下的開發模式。讀者將學習到如何將大型應用程序拆分為多個微服務,並通過API或服務發現來實現這些服務的管理和溝通。
ASP.NET Core 由微軟官方推出,開放原始程式碼並以社區為主,可以生成執行於Windows、macOS、Linux 等作業系統的新型Web 應用程式。ASP.NET Core並不是ASP.NET 的延續版本,而是經過重新設計和最佳化的框架。由於它是編譯執行的,因此在性能上的優勢明顯。而且,其內部對非同步任務和安全性做了大量整合工作,有些安全功能是預設啟用的,如對跨站漏洞攻擊的防範。經過六七個版本的迭代,ASP.NET Core 已趨向完善,對Web 前端與其他資料存取技術的相容性也得到極大提升。對於常規Web 功能、微服務、行動後端以及物聯網後端等應用場景,ASP....
目錄
第 1 章 初始化ASP.NET Core 應用程式
1.1 應用程式的啟動過程
1.2 WebApplicationBuilder類別
1.3 啟動應用程式
1.4 使用Host初始化應用程式
1.4.1 通用主機
1.4.2 範例:簡單的通用主機
1.4.3 Web主機
1.5 設定應用程式的URL
1.5.1 呼叫UseUrls()方法
1.5.2 使用WebApplication類別的Urls屬性
1.5.3 呼叫Run()方法時傳遞URL
1.5.4 透過ServerAddressesFeature物件設定URL
1.5.5 使用命令列參數
1.5.6 使用設定檔
1.5.7 使用環境變數
1.5.8 使用launchSettings.json檔案
1.5.9 Kestrel伺服器的偵聽位址
1.5.10 透過HTTP.sys設定URL
1.5.11 PreferHostingUrls() 方法的作用
1.6 應用程式生命週期事件
第 2 章 執行環境
2.1 定義執行環境
2.2 Is{EnvironmentName}擴充方法
2.3 多執行環境下的設定檔
2.4 用於環境篩選的Razor標記
2.5 執行環境與相依注入
第 3 章 相依注入
3.1 相依注入與服務容器
3.1.1 ServiceCollection類別
3.1.2 ServiceProvider類別
3.2 .NET專案中的相依注入
3.3 ASP.NET Core專案中的相依注入
3.4 建構存在相依關係的服務
3.5 服務的生存期
3.6 GetService()方法與GetRequiredService()方法的區別
3.7 注入多個服務實例
3.8 容易被忽略的問題
第 4 章 設定應用程式
4.1 設定的基本結構
4.2 在.NET應用程式中使用設定
4.3 在ASP.NET Core應用程式中使用設定
4.3.1 設定的資料來源
4.3.2 查看所有設定資訊
4.4 IConfigurationBuilder介面
4.5 ConfigurationManager類別
4.6 IConfigurationSource介面與IConfigurationProvider介面
4.6.1 自訂擴充點
4.6.2 範例:來自CSV檔案的設定
4.7 JSON設定
4.7.1 範例:存取JSON陣列物件
4.7.2 範例:自動重新載入設定
4.8 XML設定
4.9 環境變數
4.9.1 設定環境變數首碼
4.9.2 替換預設的ASPNETCORE_首碼
4.9.3 範例:替換環境變數首碼
4.9.4 分層設定結構
4.10 命令列參數
4.11 ini設定
4.12 設定與相依注入
4.12.1 範例:將IConfiguration注入MVC控制器
4.12.2 範例:透過設定選擇雜湊演算法
4.13 連結多棵設定樹
第 5 章 選項模式
5.1 選項模式概述
5.2 服務容器的擴充方法
5.3 各介面之間的關係
5.3.1 IConfigureOptions介面與IConfigureNamedOptions介面
5.3.2 IPostConfigureOptions介面
5.3.3 IValidateOptions介面
5.3.4 IOptionsFactory介面
5.3.5 完整的流程圖
5.4 選項類別的封裝介面
5.4.1 範例:在MVC 控制器中存取選項類別
5.4.2 範例:自動更新選項類別
5.5 附帶名稱的選項群組
5.6 後期設定
5.7 選項類別的驗證
5.7.1 內建的驗證方式
5.7.2 使用資料批註
5.8 處理帶有參數的建構函式
5.9 直接實現IOptions介面
第 6 章 HTTP管道
6.1 HTTP管道與中介軟體
6.2 中介軟體的實現方法
6.3 透過委託實現中介軟體
6.3.1 範例:Use()方法的簡單用法
6.3.2 HTTP管道的「短路」
6.3.3 Run()方法
6.4 透過類別實現中介軟體
6.4.1 帶有參數的中介軟體
6.4.2 中介軟體類別與相依注入
6.5 透過IMiddleware介面實現中介軟體
6.6 終結點
6.6.1 範例:常見的HTTP請求方式
6.6.2 範例:同時使用Razor Pages和MVC
6.6.3 為終結點分配名稱
6.6.4 中繼資料
6.7 有條件地執行中介軟體
6.7.1 範例:呼叫包含user_id欄位的中介軟體
6.7.2 範例:只允許以POST方式呼叫Web API
第 7 章 HTTP狀態儲存
7.1 HTTP上下文
7.1.1 範例:在中介軟體中設定回應表頭
7.1.2 範例:在Map*()方法中存取HTTP上下文
7.1.3 範例:使用Razor標記呈現HTTP請求表頭
7.1.4 範例:在MVC中存取HTTP上下文
7.2 HTTP訊息表頭
7.2.1 HeaderNames類別
7.2.2 訊息表頭的分類
7.2.3 分析複雜訊息表頭
7.3 查詢字串
7.3.1 讀取查詢參數
7.3.2 多值參數
7.4 表單資料
7.4.1 讀取簡單的表單資料
7.4.2 檔案上傳
7.5 Cookie
7.6 HttpContext類別的Items屬性
7.7 階段
7.7.1 ISession介面
7.7.2 設定階段Cookie的名稱
7.7.3 範例:將階段資料儲存到JSON檔案中
第 8 章 Razor頁面
8.1 Razor頁面的特點
8.2 Razor語法
8.2.1 兩種運算式
8.2.2 程式區塊
8.2.3 註釋
8.2.4 流程控制
8.3 開啟Razor頁面功能
8.4 Razor分頁檔
8.5 分頁檔的搜索路徑
8.5.1 設定RazorPagesOptions選項類別
8.5.2 便捷的擴充方法
8.6 頁面路由
8.6.1 透過@page指令設定路由規則
8.6.2 透過約定模型定義路由規則
8.7 頁面模型類別
8.7.1 頁面自身作為模型類別
8.7.2 從PageModel衍生類別
8.7.3 透過特性類別實現頁面模型類別
8.8 頁面處理常式
8.8.1 通用的處理常式
8.8.2 解決POST請求時出現的錯誤
8.8.3 使用多個處理常式
8.8.4 透過路由參數選擇處理常式
8.8.5 自訂的處理常式模型
第 9 章 MVC框架
9.1 MVC基本概念
9.2 啟用MVC功能
9.3 控制器
9.3.1 範例:從ControllerBase類別衍生
9.3.2 範例:從Controller類別衍生
9.3.3 範例:使用ControllerAttribute
9.3.4 範例:使用Controller尾碼
9.3.5 自訂控制器的名稱
9.3.6 範例:ControllerNameAttribute類別
9.3.7 自訂操作方法的名稱
9.3.8 範例:CustActionNameAttribute類別
9.3.9 範例:ActionNameAttribute類別
9.4 MVC路由規則
9.4.1 全域路由規則
9.4.2 範例:註冊兩筆全域路由規則
9.4.3 局部路由規則
9.4.4 IRouteTemplateProvider介面
9.4.5 透過實現約定介面定義路由規則
9.4.6 範例:CustPrefixRouteConvention類別
9.5 限制操作方法所支援的HTTP請求
9.5.1 範例:只支援HTTP-PUT請求的操作方法
9.5.2 內建特性類別
9.6 區域
9.7 視圖
9.7.1 視圖檔案的預設存放路徑
9.7.2 自訂視圖的路徑格式
9.7.3 版面配置視圖
9.7.4 範例:版面配置視圖的查詢順序
9.7.5 範例:設定Razor Pages版面配置視圖的查詢路徑
9.7.6 _ViewImports與_ViewStart檔案
9.7.7 範例:_ViewStart檔案的替換行為
9.8 IViewLocationExpander介面
9.8.1 範例:多版本視圖
9.8.2 範例:根據URL查詢參數擴充視圖路徑
9.8.3 LanguageViewLocationExpander類別
9.9 局部視圖
9.9.1 範例:成績單
9.9.2 範例:導覽列
9.10 視圖元件
9.10.1 範例:一個簡單的視圖元件
9.10.2 視圖檔案的查詢路徑
9.10.3 範例:帶有參數的視圖元件
9.10.4 透過標記幫助器呼叫視圖元件
9.10.5 範例:Greeting視圖元件
9.10.6 範例:在MVC控制器中呼叫視圖元件
9.10.7 兩個特性類別
9.11 辨識其他程式集中的控制器
9.11.1 範例:使用ApplicationPartAttribute類別
9.11.2 範例:使用AddApplicationPart()擴充方法
9.11.2 範例:使用ApplicationPartManager類別
第 10 章 模型綁定
10.1 概述
10.2 自動綁定
10.2.1 範例:計算機
10.2.2 範例:綁定陣列類型的資料
10.2.3 範例:綁定複雜類型
10.2.4 多個參數的模型綁定
10.2.5 範例:綁定3個參數
10.2.6 字典類型的模型綁定
10.2.7 範例:綁定字典資料
10.2.8 範例:綁定IFormCollection類型
10.2.9 範例:MD5計算機
10.2.10 綁定IFormFile和IFormFileCollection類型
10.2.11 範例:上傳一個文字檔
10.2.12 範例:上傳多個檔案
10.3 設定模型綁定的來源
10.3.1 範例:綁定HTTP訊息表頭
10.3.2 範例:從HTTP訊息文字提取資料
10.3.3 範例:與路由參數綁定
10.3.4 範例:FromServices特性的使用
10.3.5 範例:混合使用From*特性類別
10.3.6 範例:將From*特性類別應用於屬性成員
10.4 自訂IValueProvider介面
10.4.1 範例:由自訂字串提供的值
10.4.2 範例:CookieValueProvider
10.5 IModelBinder介面
10.5.1 內建綁定器
10.5.2 範例:AddressInfoModelBinder類別
10.6 BindRequiredAttribute類別與BindNeverAttribute類別
10.7 綁定到屬性成員
10.7.1 範例:控制器的屬性綁定
10.7.2 範例:PageModel中的屬性綁定
10.7.3 範例:CancellationToken類型的屬性綁定
第 11 章 Web API
11.1 Web API基礎
11.1.1 ControllerBase類別與Controller類別
11.1.2 ApiController特性
11.1.3 範例:一個簡單的Web API
11.1.4 範例:以POST方式提交資料
11.2 XML格式
11.2.1 範例:常規的XML序列化方案
11.2.2 範例:使用XmlDataContractSerializer方案
11.3 選擇回應格式
11.3.1 範例:透過Accept訊息表頭選擇回應格式
11.3.2 範例:使用格式篩檢程式
11.4 自訂格式
11.4.1 範例:CustDataInputFormatter類別
11.4.2 範例:BytesToHexOutputFormatter類別
11.5 極小API
11.5.1 範例:一些簡單的極小API例子
11.5.2 範例:在極小API上使用資料來源特性
11.5.3 上傳檔案.
11.5.4 範例:直接讀取檔案串流
11.5.5 範例:上傳多個檔案
11.5.6 IResult介面
11.5.7 範例:Results類別的使用
11.6 API瀏覽功能
11.6.1 IApiDescriptionGroupCollectionProvider介面
11.6.2 範例:列出已定義的Web API
11.6.3 API約定
11.6.4 Swagger框架
11.6.5 範例:使用Swagger生成API文件
第 12 章 篩檢程式
12.1 篩檢程式的執行過程
12.1.1 範例:觀察篩檢程式的執行順序
12.2.2 範例:同時實現多個介面
12.2 篩檢程式的作用域
12.1.1 範例:全域篩檢程式
12.2.2 範例:特性化的篩檢程式
12.3 在Razor Pages中使用篩檢程式
12.1.1 範例:在Razor標記頁和頁面模型類別上應用篩檢程式
12.2.2 範例:在Razor Pages中應用全域篩檢程式
12.2.3 頁面處理常式的篩檢程式
12.2.4 範例:實現IPageFilter介面
12.4 非同步篩檢程式介面
12.4.1 範例:實現非同步授權篩檢程式
12.4.2 範例:實現非同步資源篩檢程式
12.5 IAlwaysRunResultFilter介面
12.6 IFilterFactory介面
12.6.1 範例:存取服務容器中的篩檢程式
12.6.2 範例:使用TypeFilterAttribute類別建立篩檢程式實例
12.6.2 範例:使用ServiceFilterAttribute 類別存取服務容器中的篩檢程式
12.7 篩檢程式的執行順序
12.7.1 範例:篩檢程式的作用域與執行順序
12.7.2 範例:自訂篩檢程式的執行順序
12.8 抽象的篩檢程式特性類別
12.8.1 範例:重寫ActionFilterAttribute類別
12.8.2 範例:重寫ExceptionFilterAttribute類別
第 13 章 標記幫助器
13.1 標記幫助器簡介
13.1.1 範例:為標記增加「加粗」功能
13.1.2 範例:標記幫助器
13.1.3 範例:使用標記幫助器設定HTML元素的文字樣式
13.2 將標記幫助器註冊到服務容器
13.3 內建的標記幫助器
13.3.1 範例:快取當前時間
13.3.2 範例:用
第 1 章 初始化ASP.NET Core 應用程式
1.1 應用程式的啟動過程
1.2 WebApplicationBuilder類別
1.3 啟動應用程式
1.4 使用Host初始化應用程式
1.4.1 通用主機
1.4.2 範例:簡單的通用主機
1.4.3 Web主機
1.5 設定應用程式的URL
1.5.1 呼叫UseUrls()方法
1.5.2 使用WebApplication類別的Urls屬性
1.5.3 呼叫Run()方法時傳遞URL
1.5.4 透過ServerAddressesFeature物件設定URL
1.5.5 使用命令列參數
1.5.6 使用設定檔
1.5.7 使用環境變數
1.5.8 使用launchSettings.json檔案
1.5.9 Kestrel伺服器的偵聽位址
1.5.10 透過HTT...