标签:MiniAPI Console app 中间件 next ToString NET6 Now
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();
结果
想要更快更方便的了解相关知识,可以关注微信公众号
标签:MiniAPI,Console,app,中间件,next,ToString,NET6,Now 来源: https://www.cnblogs.com/axzxs2001/p/16499995.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。