asp.net core 中间件 :基本 理解 和 Filter类似。 区别: filter是mvc中包含的功能,针对 action方法
中间件 则 包含 mvc 更偏向底层
两个基本的职责:
选择是否将请求传递给管道中的下一个中间件。
可以在管道中的下一个中间件前后执行一些工作。
更详细 中间件详解 请参考 转载: ASP.NET Core:中间件 - .NET开发菜鸟 - 博客园 (cnblogs.com)
下面 自定义中间件 的基本使用,一般中间件 都在 Program.cs中
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
//自定义 中间件 map 引流
app.Map("/test", mybuilder =>
{
//use处理 并调用下一个中间件
mybuilder.Use(async (context, next) =>
{
context.Response.ContentType="text/html";
await context.Response.WriteAsync("1 start<br/>");//中间件中不要 输出内容 这是不符合规范的,这里只做演示。如果输出 不使用next 以免 造成混乱
await next.Invoke();
await context.Response.WriteAsync("1 end<br/>");
});
//use处理 并调用下一个中间件
mybuilder.Use(async (context, next) =>
{
await context.Response.WriteAsync("2 start<br/>");
await next.Invoke();
await context.Response.WriteAsync("2 end<br/>");
});
//最终处理 终端中间件
mybuilder.Run(async context =>
{
await context.Response.WriteAsync("Run<br>");
});
});
app.Run();
最后结果 执行 顺序为
1 start
2 start
Run
2 end
1 end
上面 只是 为了演示。 一般 不要 使用。推荐使用下面的 中间件类
中间件类 不要 继承 和实现接口 但是必须规范
规范1
构造函数中必须至少有 RequestDelegate
规范2
必须有 async Task InvokeAsync方法 参数为 HttpContext 并且 方法名不能写错
namespace aspnetcore012
{
public class Middleware
{
private readonly RequestDelegate _next;
//规范 构造函数中必须至少有 RequestDelegate
public Middleware(RequestDelegate next)
{
_next = next;
}
//必须有 async Task InvokeAsync方法 参数为 HttpContext 并且 方法名不能写错
public async Task InvokeAsync(HttpContext context)
{
await context.Response.WriteAsync("Middleware3 start <br/>");
//调用下个 中间件
await _next.Invoke(context);
await context.Response.WriteAsync("Middleware3 end <br/>");
}
}
}
最后 需要在 Program.cs 添加 mybuilder.UseMiddleware<Middleware>();
....
mybuilder.UseMiddleware<Middleware>();
//最终处理 终端中间件
mybuilder.Run(async context =>
{
await context.Response.WriteAsync("Run<br>");
});