当前位置: 首页 > news >正文

.Net Core 中间件与过滤器

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

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

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

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/>");});//中间件执行完成后,执行runappbuilder.Run(async ctx => {await ctx.Response.WriteAsync("hello middleware <br/>");});
});
app.Run();
//注意,如果在中间件中使用ctx.Response.WriteAsync等方式向客户端发送响应,我们就不能
//再执行next.Invoke了把请求转到其他中间件了,因为其他中间件可能会对response进行了修改
//该案例仅仅当做演示
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;//不会传递到下一个中间件}}
}
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();

http://www.lryc.cn/news/355640.html

相关文章:

  • 【ARMv7-A】——WFI(wait for interrupt)
  • 92. 反转链表 II
  • Modbus工业网关
  • c++——模板初始识
  • 帆软生成csv文件
  • 12.Redis之补充类型渐进式遍历
  • 品牌做电商控价的原因
  • 安全面试中的一个基础问题:你如何在数据库中存储密码?
  • 【python深度学习】——torch.min()
  • 华为校招机试 - 最久最少使用缓存(20240508)
  • 第三部分:领域驱动设计之分析模式和设计模式应用于模型
  • PID传感器在光电显示行业VOC气体检测的应用
  • iOS推送证书过期处理
  • 蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现
  • 【leetcode2765--最长交替子数组】
  • java文档管理系统的设计与实现源码(springboot+vue+mysql)
  • 西安航空学院电子工程学院领导莅临泰迪智能科技参观交流
  • C++|设计模式(二)|简单工厂和工厂方法模式
  • C语言从头学12——流程控制(一)
  • 10大领域应该怎么记?
  • 通过Ubuntu虚拟机+Linux移植LVGL并通过linux Frame buffer显示
  • M功能-支付平台(三)
  • 5G工厂长啥样
  • 使用Python操作Jenkins
  • 网络协议测试仪设计方案:474-便携式手提万兆网络协议测试仪
  • 使用numpy手写一个神经网络
  • 使用Spring AOP实现接口参数变更前后对比和日志记录
  • 免费无限换脸,火了,图片/视频/直播都行!
  • 无线领夹麦克风哪个品牌好?本期文章揭秘无线麦克风哪个品牌好用
  • 操作系统实验--终极逃课方法