.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();
相关推荐
onlywhz1 天前
【Golang】——Gin 框架中间件详解:从基础到实战
中间件·golang·gin
cjy0001112 天前
【AimRT】现代机器人通信中间件 AimRT
中间件·机器人
一叶飘零_sweeeet2 天前
中间件:高可用、高性能、可扩展三大核心设计原则
中间件·架构·kafka
钛态2 天前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos
NCU_wander3 天前
操作系统/数据库和业务应用/中间件/硬件之间的关系
数据库·中间件
黄俊懿5 天前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
武藤一雄5 天前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
koping_wu5 天前
常用中间件面试汇总:Mysql、Mq、Redis、操作系统、Nacos、Es、Mybatis
mysql·中间件·面试
爱学习的小可爱卢5 天前
Redis从入门到精通:入门到精通(万字详解)
数据库·redis·中间件
老毛肚5 天前
八股中间件
中间件