ASP.NET Web API 訊息處理器

ASP.NET Web API 是以 HttpRequestMessage 類別來代表用戶端發出的 HTTP 請求,並以 HttpResponseMessage 類別來代表伺服器端的回應結果。 也就是說,ASP.NET Web API 從收到用戶端請求開始到產生回應結果的過程當中,會在某個適當時間分別建立 HttpRequestMessage 和 HttpResponseMessage 物件實體。 這個收到請求、處理請求、至產生回應的過程,一般稱為管線(pipeline)。

稱為管線,因為 HTTP 請求就像水一般從第一條水管流入,行經數個相互銜接的水管,直到最後一個;處理完請求並產生回應之後,接著又讓回應結果循原路回去,流經先前的各條水管。 在這個過程當中,我們也可以安插自己的水管,在裡面動點手腳。

這一截截的「水管」對應到 Web API 的實作,就是訊息處理器(message handler)了。下圖概略描繪了 ASP.NET Web API 的「請求-回應」管線:

csharp_1

圖中的 HttpServer 類別隸屬 System.Web.Http 命名空間,其父類別是 DelegatingHandler,祖父則是抽象類別 HttpMessageHandler。 也就是說,HttpSever 本身就是個訊息處理器。根據 MSDN 網站的說明,其責任是分派 HttpRequestMessage,以及建立 HttpResponseMessage。

DelegatingHandler

DelegatingHandler 的用途是處理 HttpRequestMessage 和 HttpResponseMessage 物件,並將處理過的物件交給下一棒繼續處理(於是形成了前面提過的管線機制)。 當然,在處理的時候,也可以不要傳遞給下一個處理器,亦即停止後續的管線。

DelegatingHandler 有個 InnerHandler 屬性,型別是 HttpMessageHandler(它就是 DelegatingHandler 的父類別)。 這個 InnerHandler 會指向下一條管線──這裡稍微改個說法:InnerHandler 會指向下一層管線。

實作 DelegatingHandler


    public class MyRequestHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            //收到response前做的事

            var response = await base.SendAsync(request, cancellationToken);

            //收到response後做的事
            switch (response.StatusCode)
            {
            case HttpStatusCode.Unauthorized:
                break;
            case (HttpStatusCode)440:
                break;
            case HttpStatusCode.Forbidden:
                break;
            case HttpStatusCode.ServiceUnavailable:
                break;
            }
        }
    }

在Program.cs註冊訊息處理器


    builder.Services.AddHttpMessageHandler<MyRequestHandler>();
An unhandled error has occurred. Reload 🗙