.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();

结果

  想要更快更方便的了解相关知识,可以关注微信公众号 
 

 

posted @   刘靖凯  阅读(257)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示