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(七):中间件相关推荐

  1. .NET6之MiniAPI(三十):结束篇(附链接)

    不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...

  2. .NET6之MiniAPI(十九):NLog

    在本系例文章的第八篇中,我们聊过官方的日志实现,即<.NET6之MiniAPI(八):日志>.但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有 ...

  3. .NET6之MiniAPI(十八):OpenAPI swagger

    从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用. 在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大. OpenAPI为我们测试API提 ...

  4. .NET6之MiniAPI(二十九):UnitTest

    MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点. 本文测试框架是XUnit,Mock框架 ...

  5. .NET6之MiniAPI(二十七):Metrics

    应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库. prometheus-net的工作原理是,在应用内部埋点, ...

  6. .NET6之MiniAPI(二十一):限流

    限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量的范围,会引起服务连续崩塌, ...

  7. .NET6之MiniAPI(十五):跨域CORS(下)

    前一篇的跨域请求的方式是松宽的方式,毕竟跨域有安全风险,应尽量少的允许访问必要资源,本篇分别从请求方法,请求头和请求凭据方面了解跨域设置. 请求方法: api项目,get,post是默认访问,这里只设 ...

  8. .NET6之MiniAPI(十四):跨域CORS(上)

    为了说明跨请求,创建了两个项目,一个mini api,端口是5001,另一个razor page项目,端口是5280.5280项目会在页面用ajax的方式来请求5001,形成跨域请求,由于是本地测试, ...

  9. .NET6之MiniAPI(十三):健康检查

    程序员开发程序,是"生"的过程,运维人员负责日常运维,是"养"的过程,在养的过程,运维人员希望在第一时间了解程序的状况,健康检查,是最基础的手段. var bu ...

最新文章

  1. Windows phone 7新开发工具发布
  2. 第三期 预测——Frenet 坐标
  3. 安装系统提示选中的磁盘具有MBR分区表
  4. OpenCascade Primitives BRep-Cylinder
  5. The connection to adb is down
  6. 与毒”共舞30年!清华美女研究生为何放弃高薪,选择特招入伍?背后的原因令人泪崩......
  7. linux修改java内存大小_Linux 和 windows修改java虚拟机内存大小
  8. 清华大学操作系统公开课笔记(向勇、陈渝)
  9. python基础知识-python基础知识整理(值得收藏)
  10. python3捕获异常_Python 异常处理和捕获信息教程|python3教程|python入门|python教程
  11. 张宇八套卷(四)复盘
  12. 阿里云服务器搭建后台(Ubuntu)
  13. 【PCIe总线】-- PCI、PCIE基础知识
  14. NFT+体育,卡塔尔世界杯有哪些NFT看点!
  15. [php]-Tp5.1反序列化学习
  16. 阿里安全人机行为识别比赛 前五名队伍分享
  17. java教程51_java基础视频教程
  18. 不支持wifi,删掉“屏幕投射”
  19. Lost connection to the debugger on
  20. 学生用计算机有哪些小游戏,学生时期:那些霸占你信息课的4款游戏,最后一款,你肯定玩过...

热门文章

  1. Mahout分类算法学习之实现Naive Bayes分类示例
  2. PingingLab传世经典系列《CCNA完全配置宝典》-3.4 Trunk进阶配置
  3. 基于dnn的车牌识别_自然场景中文文字识别,身份证火车票都能识别
  4. robotframework(12)修改用户密码(从数据库查询短信验证码)
  5. linux下mysql的数据库简单备份脚本
  6. Red hat6.4重新安装yum
  7. windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
  8. TeaPot 用webgl画茶壶(3) 环境纹理和skybox
  9. 双谷人才财务管理(序)
  10. lz98n外接电源注意问题