.NET6之MiniAPI(七):中间件
http协议,是由客户端发出请求,服务端响应结果并返回,我们把这个请求来回抽象成一个请求管道,那中间件就是这个管道上的阀门,控制着流量的进出和中断。每一个请求都要经过中间件的过滤,滤掉不合格的请求,放行合格的请求,比如用户验证,只有授权的用户通过,没有授权的用户挡在门外。
中间件的定义非常简单,如下:
var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.Use(async (context, next) =>
{//一通操作await next.Invoke();
});
app.MapGet("/test", () => "ok");
app.Run();
通过参数context来获取信息,从而判断是放行还是中断,当然有的中间件始终不会中间,只是收集请求的信息,以供别用,例如监控,只是采集信息而已。
中间件一个重要特点是有顺序的,有先来后到的,其实在整体请求链路上,中件间就像Queue里的元素,最先接到Request的中间件,最后返回Response,这种特点就要注意,当两个或多个中间件有依赖关系时,要设定好前后顺序,否则是没有作用的。官方文档给出了官方中间件使用顺序的一些建议,希望重视。
var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.Use(async (context, next) =>
{Console.WriteLine("{0},第1个中间——前", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));await next.Invoke();Console.WriteLine("{0},第1个中间——后", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));
});
app.Use(async (context, next) =>
{Console.WriteLine("{0},第2个中间——前", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));await next.Invoke();Console.WriteLine("{0},第2个中间——后", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));
});
app.MapGet("/test", () => "ok");
app.Run();
结果如下:
自定义中间件类型
ThirdMiddleware中自定义的中间件类型,这是一种约定,构造中的next是从服务容器中获取的,代表着请求管道的传送委托。ThirdMiddlewareExtensions是对这个类型的扩展方法。
public class ThirdMiddleware
{private readonly RequestDelegate _next;public ThirdMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context){Console.WriteLine("{0},第3个中间——前", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));await _next(context);Console.WriteLine("{0},第3个中间——后", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF"));}
}public static class ThirdMiddlewareExtensions
{public static void UseThird(this WebApplication app){app.UseMiddleware<ThirdMiddleware>();}
}
那使用起来就比较简单了,只需要下面这个扩展方法调用就可以了。
app.UseThird();
结果
.NET6之MiniAPI(七):中间件相关推荐
- .NET6之MiniAPI(三十):结束篇(附链接)
不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...
- .NET6之MiniAPI(十九):NLog
在本系例文章的第八篇中,我们聊过官方的日志实现,即<.NET6之MiniAPI(八):日志>.但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有 ...
- .NET6之MiniAPI(十八):OpenAPI swagger
从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用. 在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大. OpenAPI为我们测试API提 ...
- .NET6之MiniAPI(二十九):UnitTest
MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点. 本文测试框架是XUnit,Mock框架 ...
- .NET6之MiniAPI(二十七):Metrics
应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库. prometheus-net的工作原理是,在应用内部埋点, ...
- .NET6之MiniAPI(二十一):限流
限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量的范围,会引起服务连续崩塌, ...
- .NET6之MiniAPI(十五):跨域CORS(下)
前一篇的跨域请求的方式是松宽的方式,毕竟跨域有安全风险,应尽量少的允许访问必要资源,本篇分别从请求方法,请求头和请求凭据方面了解跨域设置. 请求方法: api项目,get,post是默认访问,这里只设 ...
- .NET6之MiniAPI(十四):跨域CORS(上)
为了说明跨请求,创建了两个项目,一个mini api,端口是5001,另一个razor page项目,端口是5280.5280项目会在页面用ajax的方式来请求5001,形成跨域请求,由于是本地测试, ...
- .NET6之MiniAPI(十三):健康检查
程序员开发程序,是"生"的过程,运维人员负责日常运维,是"养"的过程,在养的过程,运维人员希望在第一时间了解程序的状况,健康检查,是最基础的手段. var bu ...
最新文章
- Windows phone 7新开发工具发布
- 第三期 预测——Frenet 坐标
- 安装系统提示选中的磁盘具有MBR分区表
- OpenCascade Primitives BRep-Cylinder
- The connection to adb is down
- 与毒”共舞30年!清华美女研究生为何放弃高薪,选择特招入伍?背后的原因令人泪崩......
- linux修改java内存大小_Linux 和 windows修改java虚拟机内存大小
- 清华大学操作系统公开课笔记(向勇、陈渝)
- python基础知识-python基础知识整理(值得收藏)
- python3捕获异常_Python 异常处理和捕获信息教程|python3教程|python入门|python教程
- 张宇八套卷(四)复盘
- 阿里云服务器搭建后台(Ubuntu)
- 【PCIe总线】-- PCI、PCIE基础知识
- NFT+体育,卡塔尔世界杯有哪些NFT看点!
- [php]-Tp5.1反序列化学习
- 阿里安全人机行为识别比赛 前五名队伍分享
- java教程51_java基础视频教程
- 不支持wifi,删掉“屏幕投射”
- Lost connection to the debugger on
- 学生用计算机有哪些小游戏,学生时期:那些霸占你信息课的4款游戏,最后一款,你肯定玩过...
热门文章
- Mahout分类算法学习之实现Naive Bayes分类示例
- PingingLab传世经典系列《CCNA完全配置宝典》-3.4 Trunk进阶配置
- 基于dnn的车牌识别_自然场景中文文字识别,身份证火车票都能识别
- robotframework(12)修改用户密码(从数据库查询短信验证码)
- linux下mysql的数据库简单备份脚本
- Red hat6.4重新安装yum
- windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
- TeaPot 用webgl画茶壶(3) 环境纹理和skybox
- 双谷人才财务管理(序)
- lz98n外接电源注意问题