【3】Asp.Net Core2.2新版管道處理模型

来源:https://www.cnblogs.com/w821759016/archive/2019/04/02/10643678.html
-Advertisement-
Play Games

【前言】 上一篇完成了Asp.Net Core 2.2項目的一個最簡單功能的添加,從控制器-視圖-實體輕鬆交互了一下,感覺跟之前的MVC沒啥差別!但這些都是在組件封裝的基礎上完成的,在Core裡面,其實更多的東西是靠訂製的,而不是實現固定的,包括管道處理模型!本文將跟大家探討一下,Asp.Net C ...


【前言】

上一篇完成了Asp.Net Core 2.2項目的一個最簡單功能的添加,從控制器-視圖-實體輕鬆交互了一下,感覺跟之前的MVC沒啥差別!但這些都是在組件封裝的基礎上完成的,在Core裡面,其實更多的東西是靠訂製的,而不是實現固定的,包括管道處理模型!本文將跟大家探討一下,Asp.Net Core 2.2全新的管道處理模型!

 

【管道處理模型】

 

何謂管道處理模型?本質上就是對Http請求的處理過程,在程式中表現為對 HttpContext 的一系列操作,即通過對 Request 的處理,來生成 Reponse,僅此而已。下麵給大家一個經典的Asp.Net的處理管道示意圖:

 

 

Http請求進入到程式時,已經是一個HttpWorkerRequest了,加工成HttpContext,然後交給一個HttpApplication來處理,這裡由19個主要的事件構成,覆蓋了請求處理的各個步驟,然後基於事件的註冊,能夠讓我們進行靈活的擴展,擴展性非常棒!

 

然而,在Asp.Net Core裡面,卻出現了一套更先進的管道流程,讓人嘆服!下麵讓Eleven帶大家來看看,還能怎麼樣更先進!

 

 

【新管道模型】

 

還記得那個Startup類裡面的那個Configure方法嗎?這裡就是用來配置HTTP的請求管道的。第一個參數IApplicationBuilder,就是用來構建請求管道的。

 

這裡是個介面,其預設實現類是ApplicationBuilder,是開源的,大家可以自己去下載看的。該類的核心要素有三個:

 

1 存放middleware容器,private readonly IList<Func<RequestDelegate, RequestDelegate>> _components;

2 我們熟悉的Use方法,_components.Add(middleware),將middleware放進去;

3 Build()方法,在 Hosting 的啟動中,最後就是通過該方法創建一個 RequestDelegate 類型的委托來完成整個請求的響應。

 

步驟梳理如下:

1 定義了一個 404 的RequestDelegate,作為最原始的參數;

2 用Reverse函數將註冊的中間件列表進行反轉;

3 調用最後註冊的那個middleware,結果還是RequestDelegate類型變數;

4 繼續倒序調用之前註冊的middleware,最終得到一個RequestDelegate。

而RequestDelegate是一個接受HttpContext參數,然後完成一個操作的委托,也就是對Http請求的一個步驟。因為下一個middleware是上一個middleware的參數,讓程式可以將整個步驟穿起來,類似於俄羅斯套娃,按我們的註冊順序從裡到外,一層套一層。

 

【Use】

 

下麵來使用Use方法註冊3個middleware,來詳解一下執行順序,捋一捋新管道模型是怎麼構建的,看看這個神奇的“俄羅斯套娃”!先註冊2個常規的middleware:

 

 

再註冊第三個middleware,這裡請註意,沒有Invoke那個next:

 

 

程式運行的表現是怎麼樣的呢?

 

首先在VS的程式輸出視窗,你將會看到Middleware 3-2-1的倒序輸出,這裡的原因剛纔解釋過了,會倒序調用三個註冊的middleware,所以輸出順序是倒過來的!

 

然後,打開頁面的話,將會看到如下順序:

This is Middleware1 start

This is Middleware2 start

This is Middleware3 start

This is Middleware3 end

This is Middleware2 end

This is Middleware1 end

這個順序很特別,我來跟大家說道說道。組裝完管道模型後,其實我們返回的就是第一個Use裡面返回的那個RequestDelegate,然後Http請求來了,Server監聽解析得到HttpContext,然後調用這個委托,所以最先執行的是Middleware1 start;

 

然後Next參數執行了,這個是第二個Use裡面返回的那個RequestDelegate(這裡不明白的話,再看看前面),於是執行了Middleware2 start;

然後再次執行Next參數,於是執行了Middleware3 start;

然後這裡沒有執行Next,所以就是Middleware3 end;

這時候第三個中間件動作結束,請求回去第二個中間件繼續,於是執行了Middleware2 end;

 

然後第二個中間件動作結束,請求回去第一個中間件繼續,於是執行了Middleware1 end;

 

這就是全部過程!小伙伴兒們,能看明白嗎?這就是個典型的俄羅斯套娃式,再借用個經典的中間件管道模型圖給大家。

 

 

 

【結語】

本文清晰的介紹了在Asp.Net Core2.2中的新版管道處理模型,相對於Asp.Net的管道處理模型,靈活度不可同日而語,讓人贊嘆!在沒有Core之前,Asp.Net的管道的擴展性已經非常優異了,但畢竟還是固化了很多環節,在Core這裡,完全的自由訂製,沒有任何局限的擴展空間!學習的時候,在真的懂了的那一刻,情不自禁的為別人的智慧而震撼而雀躍,文章前的小伙伴兒,你有這種感受嗎?下一篇文章中,Eleven將帶大家去理解花式的中間件註冊方式,自定義一些有效的中間件擴展,敬請關註!歡迎關註公眾號,歡迎討論,歡迎轉發,願天下有需求的人都能看到!

 

作者:Eleven

來源:公眾號【軟謀net】

 

想瞭解更多乾貨,歡迎關註公眾號【程式員在職場

                  程式員在職場


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇文章我帶著大家體驗了一把《 "ASP.NET Core 3.0 上的gRPC服務模板初體驗(多圖)" 》,如果有興趣的可以點擊鏈接進行查看,相信跟著做的你,也是可以跑起來的。這篇文章我們將一起來探討下gRPC服務如何與HTTP APIs進行比較。用於為應用程式提供API的技術是一個重要的選擇, ...
  • 原文地址:http://www.entityframeworktutorial.net/code-first/configure-classes-in-code-first.aspx 在前面的章節中,我們學習了Code-First預設的約定。Code-First使用預設的約定,從你的領域類中生成概念 ...
  • 以SqlServer為例子說明ServiceStack實現多租戶,在SqlServer中創建4個Database:TMaster、T1,T2,T3,為了安全起見 每個Database不用sa賬號,而是用獨立的資料庫的賬號和密碼,為了方便演示這密碼設置成一樣 租戶TMaster Database:TM ...
  • 在日常的資料庫運維過程中,有時候需要將Select查詢出來的數據集寫入到另一個數據表中,其中一種方式是通過存儲過程迴圈寫入數據,另一種簡便的方式是直接使用Insert Into語句後面跟上Select結果查詢語句即可將數據寫入。通過Insert Into和Select語句連用可以很快的將一個表的數據 ...
  • 在Sqlserver資料庫中,備份數據的方式有很多種,可以使用整個資料庫備份,也可使用導出包含數據和架構的腳本文件的方式來進行單表或多表數據的備份,其實還有一種Select Into的方式可以快速備份單張數據表,Select Into將自動創建備份存儲使用的新表。 Sqlserver中使用Selec ...
  • 測試代碼: 改為給Control添加擴展方法。 上述代碼,起作用的根本原因在於Component 內有 受保護的欄位Events ,該欄位記錄了附加到該控制項的所有的事件處理函數。 而wpf 控制項中沒有該成員,所以無法使用該方法判斷。但是可以使用UIElement類提供的 AddHandler 和 R ...
  • 筆記:xml序列化 /// <summary> /// xml序列化 /// </summary> /// <param name="root"></param> /// <param name="dic"></param> /// <returns></returns> private stati ...
  • 【前言】 上一篇完成了Asp.Net Core 2.2全新的管道處理模型解析,“俄羅斯套娃”式的委托嵌套和傳遞,組建了擴展性無與倫比的管道模型!與此同時,委托嵌套過於複雜,使用起來並不友好,然後多種擴展使用方式出現了,一起來看看吧! 【Run終結式擴展】 IApplicationBuilder里的U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...