1. 程式人生 > 實用技巧 >ASP.NET Core中的中介軟體和請求管道

ASP.NET Core中的中介軟體和請求管道

請求管道

請求管道是一種機制,通過該機制可以處理從請求開始到響應結束的請求。管道指定應用程式應如何響應HTTP請求。來自瀏覽器的請求經過管道並返回。組成管道的各個元件稱為中介軟體。

什麼是中介軟體

中介軟體是連線到請求管道以處理Web請求並生成響應的軟體元件。每個中介軟體都會收到並處理從前一箇中間件收到的請求。它可能決定呼叫管道中的下一個中介軟體,或將響應傳送回先前的中介軟體(終止管道)。

怎麼執行的

下圖向我們展示了請求管道如何與中介軟體結合使用,如何在ASP.NET Core應用程式中工作

首先,Http請求(直接或通過外部Web伺服器)到達應用程式。Kestrel Web伺服器拾取該請求並建立httpContext並將其傳遞給請求管道中的第一中介軟體

然後,第一個中介軟體接管,處理請求並將其傳遞給下一個中介軟體。一直進行到到達最後一箇中間件為止。最後一箇中間件將請求返回到先前的中介軟體,從而有效地終止請求管道。序列中的每個中介軟體都有第二次機會檢查請求並在返回時修改響應

最後,迴應達到Kestrel,它將響應返回給客戶端。請求管道中的任何中介軟體都可以通過不將請求傳遞給下一個中介軟體來終止請求管道

配置請求管道

要開始使用任何中介軟體,我們需要將其新增到請求管道中。這是在startup類的Configure方法中進行的。Configure方法獲取例項IApplicationBuilder,我們可以使用它註冊我們的中介軟體。

我們使用了app.Run註冊我們的第一個中介軟體的方法,該中介軟體在執行時顯示“來自中介軟體1的問候”。app.Run方法獲取Httpcontext的例項。 我們可以使用HttpContext中的Response物件將一些訊息寫到HTTP 響應。

使用和執行配置中介軟體

Use和Run方法擴充套件允許我們註冊內聯中介軟體到請求管道。Run方法新增終止中介軟體。Use方法添加了中介軟體,該中介軟體可能會呼叫管道中的下一個中介軟體。現在,我們使用app.Run

app.Use獲取兩個引數。 一個是HttpContext,第二個是RequestDelegate,基本上是對下一個中介軟體的引用。現在,再次執行程式碼。訊息“來自中介軟體1的問候”出現在瀏覽器上。 第二個中介軟體的訊息沒有出現。這是因為呼叫下一個中介軟體是當前中介軟體的責任。我們可以通過呼叫下一個中介軟體的invoke方法來呼叫下一個中介軟體,在建構函式中給我們提供了對它的引用。 修改程式碼來做到這一點

現在,執行程式碼,我們能夠看到兩條訊息。現在,讓我們新增另一箇中間件,並在呼叫下一個中介軟體後新增一條訊息

現在會發現中介軟體有第二次機會可以在回程中檢視請求

執行順序

中介軟體的執行順序與在管道中新增中介軟體的順序相同。

定製中介軟體

在上一節中,我們使用了app.Use和app.Run。建立中介軟體的另一種方法是使用類。不需要中介軟體類來實現任何介面或從任何類繼承。但是,必須遵循兩個特定規則。

  1. 中介軟體類必須宣告至少一個型別為引數的非靜態公共建構函式RequestDelegate。實際上,我們所獲得的是對管道中下一個中介軟體的引用。當我們呼叫此RequestDelegate實際上是在呼叫管道中的下一個中介軟體
  2. 中介軟體類必須定義一個名為Invoke的公共方法,該方法接受HttpContext並返回Task。這是在請求到達中介軟體時被呼叫的方法

建立自定義中介軟體

現在,讓我們建立一個簡單的類來演示這一點。我們將中介軟體命名為SimpleMiddleware

首先,在建構函式中,我們將獲得對管道中下一個中介軟體的引用。 我們將其儲存在區域性變數_next中

public SimpleMiddleware(RequestDelegate next)
{
    _next = next;
}

接下來,我們必須宣告一個Invoke方法,該方法獲取對HttpContext的引用。我們向響應寫出一些訊息,然後使用await _next(context)呼叫下一個中介軟體,並將其傳遞給HttpContext。

public async System.Threading.Tasks.Task Invoke(HttpContext context)
{
     await context.Response.WriteAsync("<div> Hello from Simple Middleware </div>");
     await _next(context);
     await context.Response.WriteAsync("<div> Bye from Simple Middleware </div>");
}

接下來,我們需要在請求管道中註冊中介軟體。我們可以使用應用程式的UseMiddleware方法做到這一點,如下所示

將以上程式碼複製到Configure方法中執行,將在瀏覽器中看到來自SimpleMiddleware的訊息。

擴充套件方式

我們可以建立一個擴充套件方法來簡化中介軟體的註冊。建立另一個類SomeMiddlewarerExtensions並建立UseSimpleMiddleware,如下所示。

現在可以使用app.UseSimpleMiddleware()代替app.UseMiddleware<SimpleMiddleware>()註冊中介軟體。