.Net Core 中间件与过滤器

过滤器这个是.Net MVC旧有的功能,中间件这个概念是新出的,

ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作,像检查用户身份、设置缓存报文头等操作都是在中间件中完成中间件就是ASP.NET Core的一个组件,由前逻辑、next、后逻辑3部分组成,多个中间件组成一个管道,一个系统中可以有多个管道。ASP.NET Core执行的过程就是http请求和响应按照中间件组装的顺序在中间件之间流转的过程。

以前有封装过滤器进行用户身份检查、预处理请求数据,中间件的同样能完成,中间件的范围更广

cs 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
//定义了对/test路径请求的处理,4-22为一个管道
app.Map("/test", async appbuilder => {
    //声明第一个中间件
    appbuilder.Use(async (context, next) => {
        context.Response.ContentType = "text/html";
        await context.Response.WriteAsync("1  Start<br/>");
        await next.Invoke();//执行下一个中间件
        await context.Response.WriteAsync("1  End<br/>");
    });
    //声明第二个中间件
    appbuilder.Use(async (context, next) => {
        await context.Response.WriteAsync("2  Start<br/>");
        await next.Invoke();
        await context.Response.WriteAsync("2  End<br/>");
    });
    //中间件执行完成后,执行run
    appbuilder.Run(async ctx => {
        await ctx.Response.WriteAsync("hello middleware <br/>");
    });
});
app.Run();
//注意,如果在中间件中使用ctx.Response.WriteAsync等方式向客户端发送响应,我们就不能
//再执行next.Invoke了把请求转到其他中间件了,因为其他中间件可能会对response进行了修改
//该案例仅仅当做演示
cs 复制代码
public class CheckAndParsingMiddleware
{
    private readonly RequestDelegate next;
    public CheckAndParsingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }
	//中间件的前逻辑、next、后逻辑都在这里
    public async Task InvokeAsync(HttpContext context)
    {
        string pwd = context.Request.Query["password"];
        if (pwd=="123")
        {
            context.Items["BodyJson"] = "hellowrld";
            await next(context);//传递到下一个中间件
        }
        else
        {
            context.Response.StatusCode = 401;//不会传递到下一个中间件
        }
    }
}
cs 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/test", async appbuilder => {
    appbuilder.UseMiddleware<CheckAndParsingMiddleware>();//按注册顺序,执行中间件类的Invoke方法
    appbuilder.Run(async ctx => {
        Console.WriteLine("run start");
        ctx.Response.ContentType = "text/html";
        ctx.Response.StatusCode = 200;
        //HttpContext.Item在同一次请求中是共享的,用它来实现中间件之间数据的传递
        await ctx.Response.WriteAsync(ctx.Items["BodyJson"].ToString());
        Console.WriteLine("run end");
    });
});
app.Run();
相关推荐
阿昌喜欢吃黄桃7 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙8 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-8 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH2312119 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会10 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了10 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路10 天前
消息中间件
中间件
都说名字长不会被发现10 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室11 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆11 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express