• ​netcore 中间件浅析


    1. 中间件的概述

    中间件是一种装配到应用管道以处理请求和响应的组件。 每个组件:

    • 选择是否将请求传递到管道中的下一个组件。

    • 可在管道中的下一个组件前后执行工作。

    请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。

    中间件是构成请求管道的基石

    2. 与Framework中IHttpModule的比较

    IHttpModule和IHttpHandler在管道里的执行示意

    img

    中间件在管道里的执行示意

    img

    • 中间件更简单

    1.模块、处理程序、 Global.asax.cs、 Web.config (IIS 配置除外)和应用程序生命周期已消失

    2.中间件已使用模块和处理程序的角色

    3.中间件使用代码而不是Web.config来配置

    • 中间件更灵活

    通过管道时,你可以将请求发送到特定的中间件,不仅可以基于 URL,还可以发送到请求标头、查询字符串等。

    • 中间件非常类似于IHttpModule

    • 按指定的规则,为每个请求按分配

    • 阻止将请求传递给下一个中间件,来对请求进行短路(短路指:停止将请求传递给下一个中间件,对客户端响应)

    • 能够创建自己的 HTTP 响应

    • 中间件和IHttpModule按不同的顺序进行处理

    • 中间件的顺序取决于它们插入请求管道的顺序,而IHttpModule的顺序主要基于应用程序生命周期事件

    • 中间件响应的顺序与请求的顺序相反。IHttpModule中,对于请求和响应,顺序是相同的。

    3. 基于约定实现一个中间件

    • 中间件生命周期默认为单例

    public class LogMiddleWare
    {
       private readonly RequestDelegate _next;
       public LogMiddleWare(RequestDelegate next)
       {
           _next = next;
       }

       public async Task InvokeAsync(HttpContext context)
       {
           await _next(context);
       }

    }

    4. 基于接口实现一个中间件

    • 生命周期可自定义

    public class UpgradeLogMiddleWare : IMiddleware
    {
       public async Task InvokeAsync(HttpContext context, RequestDelegate _next)
       {
            await _next(context);
       }
    }

    5. 将中间件加入请求管道

    通过IApplicationBuilder 接口加入管道,提供了多个方法:

    Use、Run、Map、MapWhen、UseMiddleware

    底层都是用到了Use。

    一般使用UseMiddleware,因为其提供了DI(依赖注入)的功能。

    6. 中间件传递请求

    img

    本质是通过RequestDelegate,传递HttpContenxt。

    下面的动态图,方便更好的理解

    img

    7. 中间件和过滤器的比较

    红色的线表示中间件的请求,蓝色的表示Filter的请求。

    img无关MVC/API上下文,则使用中间件,达到缩短管道流程的目的。

    参考源码:StaticFileExtensions.UseStaticFiles

    8. 终端中间件

    请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。 当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。

    img

    参考:

    自定义IHttpHandler

    自定义IHttpModule

    Webservice中使用自定义IHttpModule实现AOP

    ASP.NET C.netcore的中间件(作废).noteore 中间件

    Middleware vs. Filters

    中间件官方文档

    基于工厂的中间件



    中间件浅析.md


  • 相关阅读:
    我对软件工程的理解
    性能分析优化的道与术
    如何进行项目管理?
    如何进行项目管理?
    软件工程基础知识总结
    我经历过的监控系统演进史
    我对软件工程的理解
    10.14:线上直播问题汇总答疑
    软件工程基础知识总结
    如何进行需求分析?
  • 原文地址:https://www.cnblogs.com/wugang/p/14232349.html
Copyright © 2020-2023  润新知