關(guān)于我們
書單推薦
新書推薦
|
深入淺出:ASP.NET Core 讀者對象:本書適用于廣大高校、培訓機構(gòu).NET課程相關(guān)的教材, 或.NET愛好者的自用參考書。對于想通過自學步入編程大門的讀者, 也推薦閱讀本書 這是一本面向ASP.NET Core新手的基礎教程,學用相長,注重實踐。每個關(guān)鍵知識點都配有簡單的示例,以輔助理解。本書內(nèi)容涉及ASP.NET Core應用程序的初始化、配置,服務容器與依賴注入的使用,HTTP/中間件管道的構(gòu)建,HTTP會話狀態(tài)的維護,Razor頁面與MVC,Web API,Blazor,靜態(tài)文件的訪問,以及安全與授權(quán)。 ASP.NET Core是建立在.NET基礎上的Web開發(fā)技術(shù),經(jīng)過幾個版本的迭代,已趨于完善。隨著Blazor的不斷優(yōu)化,ASP.NET Core能同時勝任Web前端與后端的開發(fā),最終可生成高性能且跨平臺的Web應用程序。本書秉持學以致用的理念,內(nèi)容精練,通俗易懂,以實例的方式闡述知識。讀者可以參考書中實例動手實踐,提高學習效果。本書主要內(nèi)容包括: ASP.NET Core由微軟官方推出,開放源代碼并以社區(qū)為主,可以生成運行于Windows、macOS、Linux等操作系統(tǒng)的新型Web應用程序。ASP.NET Core并不是ASP.NET的延續(xù)版本,而是經(jīng)過重新設計和優(yōu)化的框架。由于它是編譯運行的,因此在性能上的優(yōu)勢明顯。而且,其內(nèi)部對異步任務和安全性做了大量集成工作,有些安全功能是默認啟用的,如對跨站漏洞攻擊的防范。經(jīng)過六七個版本的迭代,ASP.NET Core已趨向完善,對Web前端與其他數(shù)據(jù)訪問技術(shù)的兼容性也得到極大提升。對于常規(guī)Web功能、微服務、移動后端以及物聯(lián)網(wǎng)后端等應用場景,ASP.NET Core都是不錯的選擇。 本書所涉及的內(nèi)容針對性強,只要讀者具備.NET或C#編程相關(guān)基礎,即可通過本書快速掌握ASP.NET Core的關(guān)鍵技術(shù)。本書在每個知識點的講解后都會附上專門的示例,方便讀者將學到的知識馬上付諸實踐,加深印象。 ASP.NET Core配有官方開發(fā)工具,并共享.NET SDK工具。無論讀者使用的是Windows還是Linux操作系統(tǒng),都可以執(zhí)行dotnet new命令創(chuàng)建ASP.NET Core應用項目,或執(zhí)行dotnet run命令運行應用程序。 本書推薦使用官方提供的工具編寫代碼。 Visual Studio:Windows、macOS用戶均可以使用,簡稱VS。VS是著名的集成開發(fā)環(huán)境,提供從編碼、校驗、生成到調(diào)試和運行的完整支持。除了代碼提示功能,還有聯(lián)想功能,可以根據(jù)代碼上下文以及大數(shù)據(jù)匯總推斷各種代碼片段,極大地提高編碼效率。 Visual Studio Code:簡稱VS Code或VSC。VS Code是VS的一個分支版本,著重代碼編輯功能。VS Code通過安裝擴展支持各種編程語言。理論上,只要擁有足夠的擴展,VS Code就能編寫任何程序語言的代碼(如C、C 、Python、C#、Java等)。VS Code能運行在Windows、Linux及macOS等操作系統(tǒng)上,同時也支持ARM架構(gòu),如Raspberry Pi OS。使用時先執(zhí)行dotnet new命令創(chuàng)建ASP.NET Core項目,然后在VS Code中打開項目所在目錄即可。 雖然ASP.NET Core可以細分出Razor Pages、MVC、Web API、Blazor等項目,但實際上這些功能是可以在同一個項目中實現(xiàn)的。ASP.NET Core以服務容器為核心,可以組件化擴展。只要向容器注冊服務類型,就能開啟相關(guān)的功能,如MVC與Blazor功能可以同時啟用(URL路由不能有沖突)。 本書適合有一定.NET或C#基礎的讀者閱讀,也可以作為高等學校或培訓機構(gòu)的輔助教材。也歡迎想了解ASP.NET Core的開發(fā)人員閱讀本書。 由于編者水平有限,書中難免出現(xiàn)不妥之處,望廣大讀者不吝批評指正。 編 者 2024年3月 周家安:微軟最有價值專家(MVP),擅長.NET及其相關(guān)開發(fā)技術(shù),專注于探索簡單實用的編程學習方法。長期在博客園等技術(shù)社區(qū)分享編程經(jīng)驗。曾出版《Go語言入門經(jīng)典》《精通C# 5.0》《C#碼農(nóng)筆記從第一行代碼到項目實戰(zhàn)》《Python實戰(zhàn)指南手把手教你掌握300個精彩案例》等優(yōu)秀原創(chuàng)科技圖書。 第1章 初始化ASP.NET Core應用程序 1 1.1 應用程序的啟動過程 1 1.2 WebApplicationBuilder類 2 1.3 啟動應用程序 3 1.4 使用Host初始化應用程序 4 1.4.1 通用主機 5 1.4.2 示例:簡單的通用主機 5 1.4.3 Web主機 7 1.5 設置應用程序的URL 9 1.5.1 調(diào)用UseUrls()方法 9 1.5.2 使用WebApplication類的Urls屬性 10 1.5.3 調(diào)用Run()方法時傳遞URL 10 1.5.4 通過ServerAddressesFeature對象設置URL 11 1.5.5 使用命令行參數(shù) 12 1.5.6 使用配置文件 13 1.5.7 使用環(huán)境變量 13 1.5.8 使用launchSettings.json文件 14 1.5.9 Kestrel服務器的偵聽地址 14 1.5.10 通過HTTP.sys配置URL 15 1.5.11 PreferHostingUrls()方法的作用 15 1.6 應用程序生命周期事件 16 第2章 運行環(huán)境 18 2.1 定義運行環(huán)境 18 2.2 Is{EnvironmentName}擴展方法 19 2.3 多運行環(huán)境下的配置文件 21 2.4 用于環(huán)境篩選的Razor標記 23 2.5 運行環(huán)境與依賴注入 25 第3章 依賴注入 28 3.1 依賴注入與服務容器 28 3.1.1 ServiceCollection類 31 3.1.2 ServiceProvider類 32 3.2 .NET項目中的依賴注入 32 3.3 ASP.NET Core項目中的依賴注入 33 3.4 構(gòu)建存在依賴關(guān)系的服務 35 3.5 服務的生存期 38 3.6 GetService()方法與GetRequiredService()方法的區(qū)別 41 3.7 注入多個服務實例 42 3.8 容易被忽略的問題 46 第4章 配置應用程序 48 4.1 配置的基本結(jié)構(gòu) 48 4.2 在.NET應用程序中使用配置 49 4.3 在ASP.NET Core應用程序中使用配置 51 4.3.1 配置的數(shù)據(jù)來源 51 4.3.2 查看所有配置信息 51 4.4 IConfigurationBuilder接口 52 4.5 ConfigurationManager類 53 4.6 IConfigurationSource接口與IConfigurationProvider接口 54 4.6.1 自定義擴展點 55 4.6.2 示例:來自CSV文件的配置 56 4.7 JSON配置 59 4.7.1 示例:訪問JSON數(shù)組對象 62 4.7.2 示例:自動重新加載配置 63 4.8 XML配置 64 4.9 環(huán)境變量 67 4.9.1 設置環(huán)境變量前綴 68 4.9.2 替換默認的ASPNETCORE_前綴 70 4.9.3 示例:替換環(huán)境變量前綴 70 4.9.4 分層配置結(jié)構(gòu) 71 4.10 命令行參數(shù) 72 4.11 ini配置 75 4.12 配置與依賴注入 78 4.12.1 示例:將IConfiguration注入MVC控制器 78 4.12.2 示例:通過配置選擇哈希算法 79 4.13 鏈接多棵配置樹 82 第5章 選項模式 85 5.1 選項模式概述 85 5.2 服務容器的擴展方法 87 5.3 各接口之間的關(guān)系 87 5.3.1 IConfigureOptions 5.3.2 IPostConfigureOptions 5.3.3 IValidateOptions 5.3.4 IOptionsFactory 5.3.5 完整的流程圖 90 5.4 選項類的封裝接口 91 5.4.1 示例:在MVC控制器中訪問選項類 92 5.4.2 示例:自動更新選項類 93 5.5 帶名稱的選項組 95 5.6 后期配置 98 5.7 選項類的驗證 99 5.7.1 內(nèi)置的驗證方式 100 5.7.2 使用數(shù)據(jù)批注 102 5.8 處理帶參數(shù)的構(gòu)造函數(shù) 105 5.9 直接實現(xiàn)IOptions接口 108 第6章 HTTP管道 110 6.1 HTTP管道與中間件 110 6.2 中間件的實現(xiàn)方法 110 6.3 通過委托實現(xiàn)中間件 111 6.3.1 示例:Use()方法的簡單用法 114 6.3.2 HTTP管道的短路 115 6.3.3 Run()方法 116 6.4 通過類實現(xiàn)中間件 117 6.4.1 帶參數(shù)的中間件 118 6.4.2 中間件類與依賴注入 119 6.5 通過IMiddleware接口實現(xiàn)中間件 120 6.6 終結(jié)點 121 6.6.1 示例:常見的HTTP請求方式 123 6.6.2 示例:同時使用Razor Pages和MVC 125 6.6.3 為終結(jié)點分配名稱 127 6.6.4 元數(shù)據(jù) 129 6.7 有條件地執(zhí)行中間件 130 6.7.1 示例:調(diào)用包含user_id字段的中間件 131 6.7.2 示例:只允許以POST方式調(diào)用Web API 132 第7章 HTTP狀態(tài)存儲 135 7.1 HTTP上下文 135 7.1.1 示例:在中間件中設置響應標頭 136 7.1.2 示例:在Map*()方法中訪問HTTP上下文 137 7.1.3 示例:使用Razor標記呈現(xiàn)HTTP請求標頭 138 7.1.4 示例:在MVC中訪問HTTP上下文 140 7.2 HTTP消息頭 141 7.2.1 HeaderNames類 143 7.2.2 消息頭的分類 144 7.2.3 分析復雜消息頭 145 7.3 查詢字符串 148 7.3.1 讀取查詢參數(shù) 149 7.3.2 多值參數(shù) 150 7.4 表單數(shù)據(jù) 151 7.4.1 讀取簡單的表單數(shù)據(jù) 151 7.4.2 文件上傳 153 7.5 Cookie 157 7.6 HttpContext類的Items屬性 159 7.7 會話 160 7.7.1 ISession接口 161 7.7.2 設置會話Cookie的名稱 164 7.7.3 示例:將會話數(shù)據(jù)存儲到JSON文件中 164 第8章 Razor頁面 172 8.1 Razor頁面的特點 172 8.2 Razor語法 173 8.2.1 兩種表達式 173 8.2.2 代碼塊 174 8.2.3 注釋 175 8.2.4 流程控制 176 8.3 開啟Razor頁面功能 177 8.4 Razor頁面文件 178 8.5 頁面文件的搜索路徑 179 8.5.1 配置RazorPagesOptions選項類 180 8.5.2 便捷的擴展方法 180 8.6 頁面路由 181 8.6.1 通過@page指令設置路由規(guī)則 181 8.6.2 通過約定模型定義路由規(guī)則 182 8.7 頁面模型類 184 8.7.1 頁面自身作為模型類 185 8.7.2 從PageModel派生類 185 8.7.3 通過特性類實現(xiàn)頁面模型類 186 8.8 頁面處理程序 187 8.8.1 通用的處理程序 188 8.8.2 解決POST請求時出現(xiàn)的錯誤 189 8.8.3 使用多個處理程序 190 8.8.4 通過路由參數(shù)選擇處理程序 192 8.8.5 自定義的處理程序模型 193 第9章 MVC框架 199 9.1 MVC基本概念 199 9.2 啟用MVC功能 199 9.3 控制器 200 9.3.1 示例:從ControllerBase類派生 203 9.3.2 示例:從Controller類派生 205 9.3.3 示例:使用ControllerAttribute 205 9.3.4 示例:使用Controller后綴 206 9.3.5 自定義控制器的名稱 207 9.3.6 示例:ControllerNameAttribute類 207 9.3.7 自定義操作方法的名稱 208 9.3.8 示例:CustActionNameAttribute類 208 9.3.9 示例:ActionNameAttribute類 209 9.4 MVC路由規(guī)則 210 9.4.1 全局路由規(guī)則 211 9.4.2 示例:注冊兩條全局路由規(guī)則 211 9.4.3 局部路由規(guī)則 212 9.4.4 IRouteTemplateProvider接口 213 9.4.5 通過實現(xiàn)約定接口定義路由規(guī)則 214 9.4.6 示例:CustPrefixRouteConvention類 215 9.5 限制操作方法所支持的HTTP請求 217 9.5.1 示例:只支持HTTP-PUT請求的操作方法 217 9.5.2 內(nèi)置特性類 218 9.6 區(qū)域 220 9.7 視圖 221 9.7.1 視圖文件的默認存放路徑 221 9.7.2 自定義視圖的路徑格式 222 9.7.3 布局視圖 225 9.7.4 示例:布局視圖的查找順序 226 9.7.5 示例:配置Razor Pages布局視圖的查找路徑 229 9.7.6 _ViewImports與_ViewStart文件 231 9.7.7 示例:_ViewStart文件的替換行為 232 9.8 IViewLocationExpander接口 233 9.8.1 示例:多版本視圖 234 9.8.2 示例:根據(jù)URL查詢參數(shù)擴展視圖路徑 237 9.8.3 LanguageViewLocationExpander類 240 9.9 局部視圖 242 9.9.1 示例:成績單 243 9.9.2 示例:導航欄 246 9.10 視圖組件 248 9.10.1 示例:一個簡單的視圖組件 249 9.10.2 視圖文件的查找路徑 250 9.10.3 示例:帶參數(shù)的視圖組件 251 9.10.4 通過標記幫助器調(diào)用視圖組件 253 9.10.5 示例:Greeting視圖組件 254 9.10.6 示例:在MVC控制器中調(diào)用視圖組件 255 9.10.7 兩個特性類 255 9.11 識別其他程序集中的控制器 256 9.11.1 示例:使用ApplicationPartAttribute類 256 9.11.2 示例:使用AddApplicationPart()擴展方法 257 9.11.3 示例:使用ApplicationPartManager類 259 第10章 模型綁定 261 10.1 概述 261 10.2 自動綁定 262 10.2.1 示例:計算器 263 10.2.2 示例:綁定數(shù)組類型的數(shù)據(jù) 264 10.2.3 示例:綁定復雜類 266 10.2.4 多個參數(shù)的模型綁定 268 10.2.5 示例:綁定3個參數(shù) 268 10.2.6 字典類型的模型綁定 270 10.2.7 示例:綁定字典數(shù)據(jù) 270 10.2.8 示例:綁定IFormCollection類型 272 10.2.9 示例:MD5計算器 273 10.2.10 綁定IFormFile和IFormFileCollection類型 274 10.2.11 示例:上傳一個文本文件 275 10.2.12 示例:上傳多個文件 276 10.3 設置模型綁定的來源 278 10.3.1 示例:綁定HTTP消息頭 278 10.3.2 示例:從HTTP消息正文提取數(shù)據(jù) 279 10.3.3 示例:與路由參數(shù)綁定 280 10.3.4 示例:FromServices特性的使用 280 10.3.5 示例:混合使用From*特性類 282 10.3.6 示例:將From*特性類應用于屬性成員 283 10.4 自定義IValueProvider接口 284 10.4.1 示例:由自定義字符串提供的值 285 10.4.2 示例:CookieValueProvider 288 10.5 IModelBinder接口 292 10.5.1 內(nèi)置綁定器 293 10.5.2 示例:AddressInfoModelBinder類 294 10.6 BindRequiredAttribute類與BindNeverAttribute類 296 10.7 綁定到屬性成員 299 10.7.1 示例:控制器的屬性綁定 299 10.7.2 示例:PageModel中的屬性綁定 300 10.7.3 示例:CancellationToken類型的屬性綁定 302 第11章 Web API 305 11.1 Web API基礎 305 11.1.1 ControllerBase類與Controller類 305 11.1.2 ApiController特性 306 11.1.3 示例:一個簡單的Web API 306 11.1.4 示例:以POST方式提交數(shù)據(jù) 308 11.2 XML格式 310 11.2.1 示例:常規(guī)的XML序列化方案 311 11.2.2 示例:使用XmlDataContractSerializer方案 314 11.3 選擇響應格式 316 11.3.1 示例:通過Accept消息頭選擇響應格式 316 11.3.2 示例:使用格式過濾器 317 11.4 自定義格式 319 11.4.1 示例:CustDataInputFormatter類 319 11.4.2 示例:BytesToHexOutputFormatter類 323 11.5 極小API 325 11.5.1 示例:一些簡單的極小API例子 325 11.5.2 示例:在極小API上使用數(shù)據(jù)源特性 327 11.5.3 上傳文件 328 11.5.4 示例:直接讀取文件流 328 11.5.5 示例:上傳多個文件 330 11.5.6 IResult接口 332 11.5.7 示例:Results類的使用 333 11.6 API瀏覽功能 333 11.6.1 IApiDescriptionGroupCollectionProvider接口 334 11.6.2 示例:列出已定義的Web API 334 11.6.3 API約定 337 11.6.4 Swagger框架 339 11.6.5 示例:使用Swagger生成API文檔 340 第12章 過濾器 343 12.1 過濾器的執(zhí)行過程 343 12.1.1 示例:觀察過濾器的運行順序 344 12.1.2 示例:同時實現(xiàn)多個接口 348 12.2 過濾器的作用域 349 12.2.1 示例:全局過濾器 349 12.2.2 示例:特性化的過濾器 350 12.3 在Razor Pages中使用過濾器 352 12.3.1 示例:在Razor標記頁和頁面模型類上應用過濾器 352 12.3.2 示例:在Razor Pages中應用全局過濾器 353 12.3.3 頁面處理程序的過濾器 354 12.3.4 示例:實現(xiàn)IPageFilter接口 354 12.4 異步過濾器接口 355 12.4.1 示例:實現(xiàn)異步授權(quán)過濾器 356 12.4.2 示例:實現(xiàn)異步資源過濾器 356 12.5 IAlwaysRunResultFilter接口 358 12.6 IFilterFactory接口 360 12.6.1 示例:訪問服務容器中的過濾器 360 12.6.2 示例:使用TypeFilterAttribute類創(chuàng)建過濾器實例 361 12.6.3 示例:使用ServiceFilterAttribute類訪問服務容器中的過濾器 363 12.7 過濾器的運行順序 364 12.7.1 示例:過濾器的作用域與運行順序 364 12.7.2 示例:自定義過濾器的運行順序 368 12.8 抽象的過濾器特性類 369 12.8.1 示例:重寫ActionFilterAttribute類 370 12.8.2 示例:重寫ExceptionFilterAttribute類 371 第13章 標記幫助器 372 13.1 標記幫助器簡介 372 13.1.1 示例:為標記添加加粗功能 373 13.1.2 示例: 13.1.3 示例:使用標記幫助器設置HTML元素的文本樣式 375 13.2 將標記幫助器注冊到服務容器 377 13.3 內(nèi)置的標記幫助器 380 13.3.1 示例:緩存當前時間 380 13.3.2 示例:用 13.3.3 示例:asp-for屬性的使用 382 13.3.4 示例:呈現(xiàn)驗證信息 384 13.4 標記幫助器組件 386 13.4.1 示例:在 元素內(nèi)插入CSS樣式 38713.4.2 示例:使用ITagHelperComponentManager對象注冊標記幫助器組件 389 第14章 靜態(tài)文件 392 14.1 靜態(tài)文件簡介 392 14.2 使用靜態(tài)文件 393 14.2.1 示例:訪問圖像文件 393 14.2.2 示例:修改WEBROOT路徑 395 14.2.3 示例:統(tǒng)計輸入的字符數(shù)量 397 14.2.4 示例:合并多個目錄 398 14.3 目錄瀏覽 400 14.3.1 示例:瀏覽外部目錄 401 14.3.2 示例:自定義文件類型映射 401 14.4 文件服務 410 第15章 路由約束 412 15.1 路由約束的作用 412 15.2 IRouteConstraint接口 412 15.3 內(nèi)置的路由約束 413 15.3.1 示例:雙精度數(shù)值約束 415 15.3.2 示例:限制字符串長度 415 15.3.3 示例:特定格式的訂單號 416 15.3.4 示例:限制整數(shù)值的范圍 417 15.4 自定義路由約束 417 第16章 SignalR 419 16.1 WebSocket 419 16.1.1 示例:用JavaScript實現(xiàn)客戶端 419 16.1.2 示例:用.NET控制臺實現(xiàn)WebSocket客戶端 422 16.1.3 子協(xié)議 424 16.2 SignalR基礎 427 16.2.1 SignalR中心 428 16.2.2 示例:簡易計算器 428 16.2.3 示例:使用面向.NET的SignalR庫 430 16.3 調(diào)用客戶端 433 16.3.1 示例:聊天室 433 16.3.2 將客戶端定義為接口 435 16.3.3 示例:實時更新進度條 436 16.3.4 示例:記錄連接狀態(tài) 438 第17章 Blazor 442 17.1 Blazor概述 442 17.2 服務器托管 443 17.2.1 示例:使用Razor Pages承載Blazor應用 444 17.2.2 示例:在MVC視圖中承載Blazor應用 446 17.2.3 初始化腳本 448 17.2.4 示例:使用初始化腳本 449 17.2.5 示例:手動添加modules.json文件 450 17.3 WebAssembly托管 451 17.3.1 示例:手動創(chuàng)建Blazor WebAssembly項目 452 17.3.2 示例:用node.js開發(fā)Blazor WebAssembly服務器 454 17.3.3 示例:初始化腳本 457 17.3.4 DevServer 458 17.4 路由組件 459 17.4.1 示例:路由組件的簡單應用 460 17.4.2 示例:使用路由參數(shù) 461 17.4.3 示例:使用[Route]特性 463 17.5 布局組件 463 17.5.1 示例:導航欄 464 17.5.2 示例:將普通組件用于布局 466 17.6 組件參數(shù) 466 17.6.1 示例:嵌套組件的參數(shù)傳遞 466 17.6.2 示例:頂層組件的參數(shù)傳遞(Blazor Server) 467 17.6.3 示例:頂層組件的參數(shù)傳遞(Blazor WebAssembly) 468 17.7 級聯(lián)參數(shù) 469 17.7.1 示例:根據(jù)類型接收級聯(lián)參數(shù) 469 17.7.2 示例:根據(jù)命名接收級聯(lián)參數(shù) 472 17.8 事件 473 17.8.1 示例:計數(shù)器 476 17.8.2 示例:記錄鼠標指針的位置 476 17.8.3 EventCallback結(jié)構(gòu)體 477 17.8.4 示例:進度條組件 478 17.9 CSS隔離 480 17.10 數(shù)據(jù)綁定 482 17.10.1 示例:綁定日期輸入元素 483 17.10.2 示例:使用oninput事件 483 17.10.3 組件之間的綁定 484 17.10.4 示例:Slider組件 485 17.11 用.NET代碼編寫組件 486 17.11.1 渲染樹 487 17.11.2 示例:用.NET代碼實現(xiàn)App和Index組件 488 17.11.3 示例:使用依賴注入 491 17.12 .NET與JavaScript互操作 493 17.12.1 示例:調(diào)用JavaScript中的alert()方法 494 17.12.2 示例:調(diào)用QRCode.js生成二維碼 494 17.12.3 示例:階乘計算器 496 17.12.4 示例:JavaScript調(diào)用.NET對象的實例方法 497 第18章 驗證與授權(quán) 500 18.1 驗證與授權(quán)的關(guān)系 500 18.2 與驗證有關(guān)的核心服務 501 18.3 驗證處理程序 501 18.3.1 示例:驗證HTTP消息頭 502 18.3.2 示例:多個驗證方案共用一個IAuthenticationHandler接口 505 18.4 IAuthenticationSignInHandler接口 508 18.5 驗證中間件 515 18.6 授權(quán)處理程序與必要條件 519 18.6.1 示例:允許指定的部門訪問 520 18.6.2 PassThroughAuthorizationHandler類 522 18.7 授權(quán)策略 525 18.7.1 示例:按用戶星級授權(quán) 525 18.7.2 示例:集成內(nèi)置的Cookie驗證 529 18.7.3 示例:在終結(jié)點上應用授權(quán)策略 534
你還可能感興趣
我要評論
|