什么是中间件?

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

中间件 - 图1

官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0

内联中间件

  1. app.Use(async (context, next) =>
  2. {
  3. var cultureQuery = context.Request.Query["culture"];
  4. if (!string.IsNullOrWhiteSpace(cultureQuery))
  5. {
  6. //var culture = new CultureInfo(cultureQuery);
  7. //CultureInfo.CurrentCulture = culture;
  8. //CultureInfo.CurrentUICulture = culture;
  9. Console.WriteLine(cultureQuery);
  10. }
  11. Console.WriteLine("自定义中间件-前面");
  12. // Call the next delegate/middleware in the pipeline.
  13. await next(context);
  14. Console.WriteLine("自定义中间件- 后面");
  15. });

简单的自定义中间件

  1. 如果中间件的代码比较复杂,或者我们需要重复使用一个中间件的话,我们最好把中间件的代码放到单独的”中间件类”中
  2. 中间件雷士一个普通的.NET类,它不需要继承任何父类或者实现任何接口,但是这个类需要有一个 构造方法,构造方法至少要有一个RequestDelegate类型的参数,这个参数用来指向下一个中间件。这个类还需要定义 一个名字为Invoke或InvokeAsync的方法,方法至少有一个HttpContext类型的参数,方法的返回值必须是Task类型 。中间件类的构造方法和Invoke(或InvokeAsync)方法还可以定义其他参数,其他参数的值会通过依赖注入自动赋值。
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Net;
  4. namespace Filter1
  5. {
  6. public class RequestCultureMiddleware
  7. {
  8. private readonly RequestDelegate _next;
  9. public RequestCultureMiddleware(RequestDelegate requestDelegate)
  10. {
  11. this._next = requestDelegate;
  12. }
  13. public async Task InvokeAsync(HttpContext context)
  14. {
  15. var cultureQuery = context.Request.Query["culture"];
  16. if (!string.IsNullOrWhiteSpace(cultureQuery))
  17. {
  18. Console.WriteLine(cultureQuery);
  19. }
  20. Console.WriteLine("自定义中间件前面执行-----");
  21. if (string.IsNullOrWhiteSpace(cultureQuery))
  22. {
  23. var response = context.Response;
  24. response.ContentType = "application/json";
  25. response.StatusCode = (int)HttpStatusCode.InternalServerError;
  26. context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
  27. await response.WriteAsync(JsonConvert.SerializeObject(new
  28. {
  29. // customize as you need
  30. code = 400,
  31. message = "中间件检查异常没有携带culture参数"
  32. }));
  33. }
  34. else
  35. {
  36. await _next.Invoke(context);
  37. }
  38. Console.WriteLine("自定义中间件后面面执行-----");
  39. }
  40. }
  41. //拓展方法
  42. public static class MyCustomMiddlewareExtensions
  43. {
  44. public static IApplicationBuilder UseMyCustomMiddleware(
  45. this IApplicationBuilder builder)
  46. {
  47. return builder.UseMiddleware<RequestCultureMiddleware>();
  48. }
  49. }
  50. }
  51. //注入使用,2种注入方法任选其一就可。
  52. app.UseMiddleware<RequestCultureMiddleware>();
  53. app.UseMyCustomMiddleware();