[ASP.NET Core學習筆記]03-中介層(Middleware)

[ASP.NET Core學習筆記]03-中介層(Middleware)

在ASP.NET Core中,使用中介層(Middleware),來組成Request Pipeline,每一個中介層可以決定

  1. 決定是否要傳送要求到下一個中介層
  2. 可以在呼叫下一個中介層的之前或之後,執行工作

下圖為Middleware概念圖

使用IApplicationBuilder來建立Middleware

ASP.NET Core可以透過 Run Use Map等擴充方法來建立自己的Middleware

而第一個Run會終止Request pipeline,Use可以把多個Middleware串連在一起,Map為可以對應Route設定而執行不同的Request pipeline,接下來我們就來嘗試一下這三種的區別。

app.Run:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //app.Run 會終止所有Request Pipeline 下面的Middle01不會執行
    app.Run(async context => { await context.Response.WriteAsync("Hello world"); });

    app.Use(
        async (context, next) =>
            {
                Console.WriteLine("BeforeMiddleware01");
                await next.Invoke();
                Console.WriteLine("AfterMiddleware01");
            });

}

app.Use

//app.Use 會將要求傳至下一個Middleware
//以下設定呼叫的順序會是 BeforeMiddleware01 -> BeforeMiddleware02 -> AfterMiddleware02 -> AfterMiddleware01
        app.Use(
            async (context, next) =>
                {
                    Console.WriteLine("BeforeMiddleware01");
                    await next.Invoke();
                    Console.WriteLine("AfterMiddleware01");
                });

        app.Use(
            async (context, next) =>
                {
                    Console.WriteLine("BeforeMiddleware02");
                    await next.Invoke();
                    Console.WriteLine("AfterMiddleware02");
                });

實際執行結果

app.Map
//app.Map 是app.Run的擴充,可以根據route路徑來套用app.Run的MiddleWare

app.Map("/map1",
            config =>
            {
                config.Run(async (context) =>
                {
                    await context.Response.WriteAsync("Map Test 1");
                });
            });

app.Map("/map2",
    config =>
    {
        config.Run(async (context) =>
        {
            await context.Response.WriteAsync("Map Test 2");
        }); 
    });

實際執行結果

順序

Startup.Configure 方法中的MiddleWare可以定義叫用與回應的順序,對於效能、安全、功能性來說,這些順序很重要

  1. 例外狀況/錯誤處理
  2. HTTPS 重新導向 (UseHttpsRedirection)
  3. 靜態檔案 (UseStaticFiles)
  4. Cookie 原則 (UseCookiePolicy)
  5. 驗證 (UseAuthentication)
  6. 工作階段 (UseSession)
  7. MVC (UseMvc)

ASP.NET Core 有內建提供一些MiddleWare可供使用
請參考官方說明文件