上一章已经说过了,中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:
- 选择是否将请求传递到管道中的下一个组件。
- 可在管道中的下一个组件前后执行工作。
- 请求委托用于生成请求管道。 请求委托处理每个
HTTP
请求。
一句话总结:中间件是比筛选器更底层,更上游的面向切面技术,其性能最高,可处理的应用范围远比过滤器广,如实现网关,URL
转发,限流等等。
下面用一个简单例子来说明如何自定义一个中间件:
新建一个类:MyMiddleware
public class MyMiddleware
{
private ILogger<MyMiddleware> logger;//日志记录类
private readonly RequestDelegate _next;//请求委托:用于生成请求管道
public MyMiddleware(ILogger<MyMiddleware> logger, RequestDelegate next)
{
this.logger = logger;
_next = next;
}
public Task InvokeAsync(HttpContext context)
{
//给请求添加一个自定义头字段
context.Request.Headers["lwpoor"] = "123";
logger.LogInformation($"这是{nameof(MyMiddleware)}中间件");
string headers = "\n--------------headers------------\n";
foreach (var header in context.Request.Headers)
{
headers+=header.Key + "=" + header.Value + "\n";
}
headers += "--------------------------------";
logger.LogInformation(headers);
// 调用下一个中间件
return _next(context);
}
}
写一个扩展方法,将中间件暴露出去:
新建一个静态类:MyMiddlewareExtensions
/// <summary>
/// 扩展方法,将中间件暴露出去
/// </summary>
public static class MyMiddlewareExtensions
{
/// <summary>
/// 测试中间件
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IApplicationBuilder UseLwpoor(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMiddleware>();
}
}
最后一步注册中间件:
app.UseLwpoor();//注册中间件
这样就自己定义了一个简单的中间件,运行程序看一下:
需要注意的地方:
自定义中间件必须要实现 InvokeAsync 公共方法,参数必须保持一致,它是中间件执行的入口
如果没有实现 InvokeAsync 方法运行会报错:“找不到'Hero.Jwt.MyMyMiddleware'类型的中间件的公共'Invoke'或'InvokeAsync'方法
必须要在构造函数里面申明请求委托 RequestDelegate ,用于生成请求管道:
并且在完成后 return _next(context) 调用下一个中间件