当前位置: 首页 > 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();

相关文章:

  • 02 FreeRTOS 任务
  • PyCharm面板ctrl+鼠标滚轮放大缩小代码
  • 基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码
  • three.js官方案例webgl_loader_fbx.html学习
  • Docker打包之后如何将进行变成压缩包进行传输和使用?
  • XSKY CTO 在英特尔存储技术峰会的演讲:LLM 存储,架构至关重要
  • 人脸识别技术的前沿技术和应用场景
  • 华为交换机、路由器开局(基础配置及远程登录)
  • OrangePi AIpro评测 - 基础操作篇
  • OpenHarmony 实战开发——内核对象队列之算法详解
  • 使用RAG和文本转语音功能,我构建了一个 QA 问答机器人
  • 【Paddle2ONNX】为Paddle2ONNX升级Opset版本到18
  • 免费,Python蓝桥杯等级考试真题--第12级(含答案解析和代码)
  • el-table 实现嵌套表格的思路及完整功能代码
  • “胖东来”超市商业模式,为何被誉为中国零售业是神一般的存在?
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C语言笔记(第一章:C语言编程)
  • Docker下部署自己的LNMP工作环境
  • flask接收请求并推入栈
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Less 日常用法
  • Linux链接文件
  • MySQL主从复制读写分离及奇怪的问题
  • PaddlePaddle-GitHub的正确打开姿势
  • React+TypeScript入门
  • storm drpc实例
  • vue总结
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 检测对象或数组
  • 前端技术周刊 2019-02-11 Serverless
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 收藏好这篇,别再只说“数据劫持”了
  • 通过npm或yarn自动生成vue组件
  • 小程序开发中的那些坑
  • 写代码的正确姿势
  • 一份游戏开发学习路线
  • 一个完整Java Web项目背后的密码
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​虚拟化系列介绍(十)
  • (06)Hive——正则表达式
  • (1)Android开发优化---------UI优化
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (四)Controller接口控制器详解(三)
  • (转)大道至简,职场上做人做事做管理
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET BackgroundWorker
  • .NET Micro Framework初体验
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 设计一套高性能的弱事件机制
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)