本教程會對基本的.Net Core 進行一個大概的且不會太深刻的講解, 在您看完本系列以後, 能基本甚至熟練的使用.Net Core進行Web開發, 感覺到.Net Core的魅力.html
本教程知識點大致分爲如下幾個階段數據庫
上一節咱們介紹了服務註冊和基本的管道執行流程, 而且講到了中間件, 這一節咱們就來詳細談談中間件這個東西瀏覽器
講中間件, 其實就是講Startup類裏面的 ConfigureServices 和 Configure 這兩個方法安全
在程序啓動類 Program 中, 咱們在 CreateWebHostBuilder 方法中調用了UseStartup方法, 裏面用泛型注入了 Startup 類, 那程序就會自動實例化這個類, 而且去執行它裏面的 ConfigureServices 和 Configure 這兩個方法. 咱們就能夠作不少配置操做app
首先調用的第一個方法固然就是構造函數, 這裏沒有沒有, 咱們不說, 而後就是 ConfigureServices 方法. 這個方法上一節已經使用過了, 在這個方法裏面, 咱們能夠註冊一些服務或者咱們叫自定義服務. 註冊完服務, 咱們就能夠經過依奈注入的方式在其它地方使用這些服務.async
而後再執行的方法就是 Configure 這個方法. 咱們能看到 Configure 方法默認的第一個參數是 IApplicationBuilder 接口, 能夠理解爲整個程序的根, 咱們經過這個接口對象, 能夠精確的配置獲取啓用咱們的中間件, 使咱們的各類中間件組合起來, 造成一個完美的Web應用程序, 去處理咱們的HTTP請求而且作出對應的響應等等.函數
講以前, 咱們先把post
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); }
這幾行代碼註釋掉, 待會再用, 再去解釋這個是幹嗎用的, 爲何要加個if, 這裏先註釋掉性能
咱們看這個代碼單元測試
app.Run(async (context) => { var msg = welcome.GetWelcomMsg(); await context.Response.WriteAsync(msg); });
這個app.Run方法, 能夠理解爲咱們本身寫的一箇中間件, 它什麼都不幹, 就是爲響應輸出一個字符串. 其實這是新建項目默認生成的.
在真實的項目中, 咱們基本上不會使用app.Run這個方法去處理咱們的請求, 由於我作的事情遠遠比輸出一個字符串複雜不少.
在實際開發中, 咱們一般使用的中間件都是app.Usexxxx開頭的, 才能組成一個完成的Web項目, 好比 app.UseMvc / app.UseStaticFiles等等這些方法去啓用系統自帶的中間件獲取別的第三方中間件.
咱們這裏啓用個ASP.Net Core MVC自帶的彩蛋中間件吧, 代碼爲: app.UseWelcomePage(); 啓用默認的MVC歡迎頁面. 咱們F5執行.
咱們可以正常看到出現了一個頁面, 而不是簡單的一個字符串的輸出了
而後咱們嘗試改變一下地址欄, 隨便寫個什麼, 能夠發現, 咱們隨便怎麼輸入地址, 都是進入到歡迎頁, 如圖 :
到這裏, 咱們就能夠發現, 這個"彩蛋"中間件的"優先級"仍是很高的, 在ASP.Net Core MVC發現你使用了這個中間件的時候, 他就不會執行後面的東西了, 或者說不會執行後面的中間件了.
還有呢, 在咱們使用中間件的時候, 或者說是在調用app.Usexxxx方法的時候, 通常來講, 這個方法都會接受一個對象參數, 這個參數能夠對這個中間件進行一些配置, 下面咱們嘗試配置一下"彩蛋"中間件, 告訴你們中間件是怎麼配置的. 代碼是這樣的
app.UseWelcomePage(new WelcomePageOptions { Path = "/welcome" });
都能看到, 這裏是爲"彩蛋"配置了一個地址(路徑), 如今咱們F5看看效果
會發現網頁輸出是個字符串, 那咱們在地址後面加上 /welcome 再看看, 能夠發現能正常出現"彩蛋"了, 說明這個配置是有效的.
固然個人目的不是講這個"彩蛋"怎麼使用, 而是給你們介紹中間件怎麼使用, 怎麼去配置中間件, 基本上全部的中間件都是這個使用方式和配置方式.
既然說到了這裏, 那咱們來講說 app.Use 這個方法. 這個方法怎麼說呢, 就是它比較"底層", 由於app.Use裏面的參數類型是 RequestDelegate , 也就是當前請求對象的委託, 相對比較"底層", 能夠說是當前請求管道的"原型". 咱們來寫一些代碼試試吧.
app.Use(next => { return async context => { if (context.Request.Path.StartsWithSegments("/first")) { await context.Response.WriteAsync("First"); } else { await next(context); } }; });
咱們寫的代碼如上, 它的意思就是: 當前地址是 /first 的時候, 輸出 First 這個字符串, 不然就無論, 繼續往下執行, 去執行別的中間件, 咱們運行看看效果. 能夠發現, 默認輸出的是 你好, .Net Core 2.2, 當咱們把地址後面加上 /first 的時候, 輸出的就是 First, 如圖:
咱們再輸入地址 /welcome 的是, 能夠看到"彩蛋"正常出現了, 能夠看到, 咱們的Use方法是正常的
在實際開發過程當中, 咱們不多直接使用app.Use方法去處理咱們的底層請求的, 這裏只是簡單介紹了這個方法, 以及它能幹什麼.
知道app.Use是幹什麼的, 那就把上面的app.Use方法刪掉吧, 或者註釋掉, 咱們下面的教程不會用的.
接下來, 咱們乾點壞事, 咱們在 app.Run 方法裏面手動報個異常出來, 代碼以下:
app.Run(async (context) => { throw new Exception(); var msg = welcome.GetWelcomMsg(); await context.Response.WriteAsync(msg); });
咱們執行項目, 會看到出現了500錯誤, Chrome瀏覽器是這樣的, 其它瀏覽器可能不同
可是咱們不但願這樣, 咱們但願咱們能看到異常的詳細信息, 這時候, 咱們就須要啓用一個異常中間件, 就是咱們上面註釋掉的那個 iif (env.IsDevelopment()) 的代碼, 咱們把它啓用起來, 那麼咱們的 Configure 方法裏面代碼就是這樣的, 如圖:
而後咱們再F5運行項目, 就是這樣的了, 如圖:
咱們的異常就很明顯了, 很好排查錯誤
至於爲何加個if (env.IsDevelopment()), 這個代碼一看就知道意思了吧, 就是當前環境是開發環境的時候, 才啓用這個異常顯示中間件
由於咱們只但願在開發或者調試的時候, 才顯示異常的詳細信息, 別的環境不顯示, 這樣安全一些, 若是不加這個 if , 會在任何環境都會顯示詳細的錯誤信息, 這樣可能會給咱們的Web應用帶來安全隱患.
因此, 咱們再加個else , 在else裏面啓用一個別的中間件, 代碼以下:
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(); }
這樣咱們不是在開發環境的時候, 發送異常就是這樣的:
不至於暴露一些敏感的信息
咱們發現這個啓動異常頁面中間件的代碼寫在最上面, 那咱們把它移動到 Configure 方法的最後面, 會怎麼樣呢 ? 咱們試試, 代碼如圖:
能夠看到, 我把異常頁面中間件移動到最後面啓用了, 咱們F5運行項目, 會發現, 瀏覽器不出先異常頁面了, 而是直接 500 錯誤.
能夠知道, 中間件的啓用順序是有依奈關係和順序的, 不能隨便啓用的, 須要在正確的位置啓用對應的中間件, 若是順序錯了, 可能會致使中間件失效, 若是你在開發過程當中, 啓用了某個中間件, 可是它卻沒效果, 可使用該思路進行排查.
到這裏, 這一節就結束了, 到目前爲止, 咱們的Web應用功能很簡單, 就是輸出一個字符串和啓用了一個"彩蛋".
咱們還講到了"環境", 好比上面的 if (env.IsDevelopment()) 判斷是否是開發環境, 那麼怎麼改變這個環境, 讓咱們在開發或者試運行和運營環境切換, 加載不一樣的配置和啓用不一樣的中間件
咱們再下一節講ASP.Net Core MVC的環境設置
若是在使用.Net Core遇到任何問題, 都加羣進行討論, 羣號: 1羣: 225982985. 2羣: 726648662. 3羣: 654015377