​netcore 中间件浅析

摘要:
中间件与IHttpModule非常相似。根据指定的规则,它根据分配阻止每个请求传输到下一个中间件,以缩短请求。它可以创建自己的HTTP响应中间件,IHttpModule可以根据中间件插入请求管道的顺序以不同的顺序处理中间件。IHttpModule的顺序主要基于应用程序生命周期事件。中间件响应的顺序与请求的顺序相反。在IHttpModule中,请求和响应的顺序是相同的。参考源代码:StaticFileExtensions。UseStaticFiles 8.终端中间件请求管道中的每个中间件组件负责调用管道中的下一个组件或缩短管道。

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

中间件官方文档

基于工厂的中间件



​netcore 中间件浅析第7张中间件浅析.md


免责声明:文章转载自《​netcore 中间件浅析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇select2动态查询及多选MySQL 主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

GIS中的数据库.gdb与.mdb的区别

Gdb是文件地理数据库,mdb是个人地理数据库,两者都是数据库文件类型。个人地理数据库是基于access数据库的个人数据库格式mdb,可存储不超过2G的文件,仅适用于Windows系统;文件数据库是保存在文件系统文件夹中的各种类型的GIS数据集的集合。请参阅文章“GIS中database.gdb和.mdb之间的区别是什么?”,m892832piczpec5。...

数据不平衡的相关

大多数常见的机器学习算法不能很好地处理不平衡的数据集。例如,搜索引擎的点击预测(点击页面往往占很小的比例)、电子商务中的产品推荐(正在购买的推荐产品的比例很低)、信用卡欺诈检测、网络攻击识别、癌症检测等。处理数据不平衡的方法主要有以下几种。2.数据级别2.1重新采样2.1.1欠采样(下采样)欠采样通过减少丰富类的大小来平衡数据集。它试图通过增加稀有样本的数量...

解决微信公众平台接口配置信息配置失败问题

填写完URL和TOKEN后,当您单击“提交”时,系统将始终提示您“配置失败”或其他错误,以确认URL所指向的后台页面代码是否正常。请确认TOKEN配置是否正常。此时,请检查INDEX页面的编码格式,并将其更改为GB2312进行尝试,这可能会解决您的问题。我想把这篇文章献给我浮躁的自己。...

mysql状态查看 QPS/TPS/缓存命中率查看

showglobalstatusslike'Com_ commit';showstatslike“无缓冲池读取%”;Thread_cache_Hits=(1-Thread_created/connections)*100%(8)锁定状态mysql>showstatslike“Binlog_缓存%”;...

es6 proxy浅析

代理用于定义用户定义的基本操作行为,如搜索、分配、枚举、函数调用等。代理接受要代理的目标对象和一些包含元操作的对象,为要代理的对象创建“屏障”,拦截所有操作,并将其重定向到用户定义的元操作对象。然而,proxy提供了一种更好的方法来实现类似的私有属性constenablePrivate==˃newProxy(target,{has:(obj,k)=˃(!pr...

Sublime Text 格式化JSON-pretty json

输入prettyjson回车,稍等片刻即可完成安装。...