[料理佳餚] ASP.NET Core 撰寫 Middleware 的 2+2 種方式

在前一篇文章 [料理佳餚] ASP.NET Core 的虛擬目錄哪去了?中有提到,傳統 ASP.NET 的 HTTP Handler 及 HTTP Modules 的工作在 ASP.NET Core 是由 Middleware 來負責處理,這篇文章就來介紹撰寫 Middleware 的幾種方式。

Use() 方法

第一種最直接的方式就是在 Configure() 方法裡面,直接用 app.Use() 撰寫,假定我想要在每一個網頁的最下方帶一個 Made by Johnny 的註解,Middleware 就可以這樣寫:

效果如下:

Middleware 類別

第二種方式是建立一個專門的類別,這個類別至少需要注入一個 RequestDelegate 的物件,以及 public Task Invoke(HttpContext context) { }public Task InvokeAsync(HttpContext context) { } 方法,相同的範例,程式碼如下:

public class SignatureMiddleware
{
    private readonly RequestDelegate next;

    public SignatureMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        await this.next.Invoke(context);

        if (Regex.IsMatch(context.Response.ContentType, "text/html", RegexOptions.IgnoreCase))
        {
            await context.Response.WriteAsync("<!--Made by Johnny-->");
        }
    }
}

接著在 Configure() 方法中,加入 app.UseMiddleware<SignatureMiddleware>() 就可以了。

搭配擴充方法

我們可以將上述兩種方式使用擴充方法加以包裝,在使用上就會更簡潔一點,這也會方便我們帶參數進去。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學