<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一節我們介紹了服務註冊和基本的管道執行流程, 並且講到了中介軟體, 這一節我們就來詳細談談中介軟體這個東西
講中介軟體, 其實就是講Startup類裡面的ConfigureServices 和Configure 這兩個方法
在程式啟動類Program 中, 我們在CreateWebHostBuilder 方法中呼叫了UseStartup方法, 裡面用泛型注入了 Startup 類, 那程式就會自動範例化這個類, 並且去執行它裡面的ConfigureServices 和Configure 這兩個方法. 我們就可以做很多設定操作
首先呼叫的第一個方法當然就是建構函式, 這裡沒有沒有, 我們不說, 然後就是ConfigureServices 方法. 這個方法上一節已經使用過了, 在這個方法裡面, 我們可以註冊一些服務或者我們叫自定義服務. 註冊完服務, 我們就可以通過依奈注入的方式在其它地方使用這些服務.
然後再執行的方法就是Configure 這個方法. 我們能看到Configure 方法預設的第一個引數是IApplicationBuilder 介面, 可以理解為整個程式的根, 我們通過這個介面物件, 可以精確的設定獲取啟用我們的中介軟體, 使我們的各種中介軟體組合起來, 形成一個完美的Web應用程式, 去處理我們的HTTP請求並且做出對應的響應等等.
講之前, 我們先把
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基礎系列之中介軟體的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45