什么是中间件?
中间件是ASP.NET Core 的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件

官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0
内联中间件
app.Use(async (context, next) =>{var cultureQuery = context.Request.Query["culture"];if (!string.IsNullOrWhiteSpace(cultureQuery)){//var culture = new CultureInfo(cultureQuery);//CultureInfo.CurrentCulture = culture;//CultureInfo.CurrentUICulture = culture;Console.WriteLine(cultureQuery);}Console.WriteLine("自定义中间件-前面");// Call the next delegate/middleware in the pipeline.await next(context);Console.WriteLine("自定义中间件- 后面");});
简单的自定义中间件
- 如果中间件的代码比较复杂,或者我们需要重复使用一个中间件的话,我们最好把中间件的代码放到单独的”中间件类”中
- 中间件雷士一个普通的.NET类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个 构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义 一个名字为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型 。中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。
using Newtonsoft.Json;using System;using System.Net;namespace Filter1{public class RequestCultureMiddleware{private readonly RequestDelegate _next;public RequestCultureMiddleware(RequestDelegate requestDelegate){this._next = requestDelegate;}public async Task InvokeAsync(HttpContext context){var cultureQuery = context.Request.Query["culture"];if (!string.IsNullOrWhiteSpace(cultureQuery)){Console.WriteLine(cultureQuery);}Console.WriteLine("自定义中间件前面执行-----");if (string.IsNullOrWhiteSpace(cultureQuery)){var response = context.Response;response.ContentType = "application/json";response.StatusCode = (int)HttpStatusCode.InternalServerError;context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;await response.WriteAsync(JsonConvert.SerializeObject(new{// customize as you needcode = 400,message = "中间件检查异常没有携带culture参数"}));}else{await _next.Invoke(context);}Console.WriteLine("自定义中间件后面面执行-----");}}//拓展方法public static class MyCustomMiddlewareExtensions{public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder builder){return builder.UseMiddleware<RequestCultureMiddleware>();}}}//注入使用,2种注入方法任选其一就可。app.UseMiddleware<RequestCultureMiddleware>();app.UseMyCustomMiddleware();
