中間件是被用到管道(pipeline)上來處理請求(request)和響應的(response)。app
asp.net core 自己提供了一些內置的中間件,可是有一些場景,你可能會須要寫一些自定義的中間件。asp.net
1. 建立一個使用匿名委託的中間件組件的形式async
public class Startup { public void Configure(IApplicationBuilder app) { app.Use((context, next) => { 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(); }); app.Run(async (context) => { await context.Response.WriteAsync( $"Hello {CultureInfo.CurrentCulture.DisplayName}"); }); } }
注:app.use中return next()會傳遞到下一個中間件繼續執行;而僅僅只使用app.use 的用法和app.run相同,即不會再傳遞到下一個中間件,在此做爲請求處理的結束ui
2.把中間件的委託封裝到類裏面,即把中間件寫成一個類的形式this
using Microsoft.AspNetCore.Http; using System.Globalization; using System.Threading.Tasks; namespace Culture { public class RequestCultureMiddleware { private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public async 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 await _next(context); } } }
而後,再使用一箇中間件擴展方法,經過IApplicationBuilder使用中間件spa
using Microsoft.AspNetCore.Builder; namespace Culture { public static class RequestCultureMiddlewareExtensions { public static IApplicationBuilder UseRequestCulture( this IApplicationBuilder builder) { return builder.UseMiddleware<RequestCultureMiddleware>(); } } }
最後,在 Startup.Configure 中調用中間件.net
public class Startup { public void Configure(IApplicationBuilder app) { app.UseRequestCulture(); //調用中間件 app.Run(async (context) => { await context.Response.WriteAsync( $"Hello {CultureInfo.CurrentCulture.DisplayName}"); }); } }
另外,這裏還有一點,這個地方不是很懂,說下本身的理解,歡迎大佬指正code
當中間件中注入的還有其餘service(官方叫 a scoped service )時,須要使用的是Invoke方法,而不是InvokeAsync方法中間件
public class CustomMiddleware { private readonly RequestDelegate _next; public CustomMiddleware(RequestDelegate next) { _next = next; } // IMyScopedService is injected into Invoke public async Task Invoke(HttpContext httpContext, IMyScopedService svc) { svc.MyProperty = 1000; await _next(httpContext); } }
這裏,Invoke和InvokeAsync是否是相同,仍是說就僅僅是命名不一樣,其餘用法都同樣?blog
歡迎指正
參考網址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-2.2