首先要明確什麼是中間件?微軟官方解釋:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x 也就是中,我們需要在整個應用程式的請求管道中註入某一個中間層來做我們想做的事情。談談我 ...
首先要明確什麼是中間件?微軟官方解釋:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x
也就是中,我們需要在整個應用程式的請求管道中註入某一個中間層來做我們想做的事情。談談我的理解:
就拿asp.net 的管道模型來說,以往的.net請求管道中我們知道有21個(應該不止)事件來分別處理相應的模塊,這是微軟為我們設計好的,如果我們需要拓展出來什麼,在相應的事件中寫入註冊就可以了。但是現在的軟體設計模型逐漸的加入了一層---中間件,在整個的應用程式請求管道,我們不做任何的事件封裝,而是開放出來,由程式猿自己在某個應用程式的某個部分寫入自己需要註入的,而且可以註入多個,但是順序什麼的就是由自己定義了。
那麼我們就需要基於IApplicationBuilder來構建我們的中間件。在哪個方法裡面調用呢?那必須是Configure方法。根據微軟官方的解釋:Configure 方法用於指定如何響應HTTP 請求。在這裡我們需要使用微軟的UseMiddleware<T> 拓展方法來構建我們的中間件(每個Use擴展方法將中間件組件添加到請求管道)。我們將中間件封裝在類中,並且通過擴展方法公開。封裝如下:
public class RequestCultureMiddleware { private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public Task InvokeAsync(HttpContext context) { var cultureQuery = context.Request.Query["culture"]; if (!string.IsNullOrWhiteSpace(cultureQuery)) { var culture = new CultureInfo(cultureQuery); CultureInfo.CurrentCulture = culture; CultureInfo.CurrentUICulture = culture; } // Call the next delegate/middleware in the pipeline return _next(context); } }
接著我們基於IApplicationBuilder介面拓展我們的中間件。通過UseMiddleware 來使用中間件。
public static class RequestCultureMiddlewareExtensions { public static IApplicationBuilder UseRquestCulture(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestCultureMiddleware>(); } }
最後我們在Configure中使用我們的中間件:
// 自定義中間件. app.UseRquestCulture();
一般來講,我們是在ConfigureServices 方法中註冊服務,然後在Configure 方法中使用,但是
Configgure 方法可使用IApplicationBuilder實例來配置請求管道,不需要再服務容器重註冊。當然我們也可以那麼做,請參看: https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/startup/sample