当前位置: 主页 > 今期新老藏宝图记录 > Core 中间件
 

Core 中间件

【论文时间: 2019-08-08 19:53

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

  请求委托通过使用IApplicationBuilder类型的Run、Map和Use扩展方法来配置,并在Strartup类中传给Configure方法。每个单独的请求委托都可以被指定为一个内嵌匿名方法(称为并行中间件,in-line middleware),或者其定义在一个可重用的类中。这些可重用的类被称作“中间件”或“中间件组件”。请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。当中间件短路时,它被称为“终端中间件”(terminal middleware),因为它阻止中间件进一步处理请求。

  ASP.NET Core请求管道包含一系列请求委托,依次调用。下图演示了这一概念。沿黑色箭头执行。

  每个委托(中间件)均可在下一个委托前后执行操作。任何委托都能选择停止传递到下一个委托,转而自己处理该请求,这就是请求管道的短路(下面会举例说明)。而且是一种有意义的设计,因为它可以避免不必要的工作。比如,一个授权(authorization)中间件只有通过身份验证之后才能调用下一个委托,否则它就会被短路,并返回“Not Authorized”的响应。所以应尽早在管道中调用异常处理委托,这样它们就能捕获在管道的后期阶段发生的异常。

  现在我们来演示下用一个简单的Core应用程序建立单个请求委托处理每个HTTP请求(这种情况不包括实际请求管道):

  由上面我们可以看到,运行时输出的是Run委托消息,然后我们再定义多一个请求委托看看效果,请看如下代码:

  由上述代码可以看到,我们定义两个Run委托,但是运行第一个Run委托的时候就已经终止了管道,这是为什么呢?

  因为Run方法又称为短路管道(它不会调用next请求委托)。因此,Run方法一般在管道尾部被调用。Run是一种约定,有些中间件组件可能会暴露他们自己的Run方法,而这些方法只能在管道末尾处运行。

  通过响应结果,我们可以看到Use方法将多个请求委托链接在一起。而next参数表示管道中的下一个委托。可通过不调用next 参数使管道短路,通常可在下一个委托前后执行操作。管家婆截至昨晚记者截稿时记者将继续向相关部

  向figure方法添加中间件组件的顺序定义了在请求上调用它们的顺序,以及响应的相反顺序。此排序对于安全性、性能和功能至关重要。

  以下Startup.Configure方法将为常见应用方案添加中间件组件:

  从上述示例代码中,每个中间件扩展方法都通过Microsoft.AspNetCore.Builder命名空间在 IApplicationBuilder上公开。但是为什么我们要按照这个顺序去添加中间件组件呢?下面我们挑几个中间件来了解下。

  ●UseExceptionHandler(异常/错误处理)是添加到管道的第一个中间件组件。因此我们可以捕获在应用程序调用中发生的任何异常。那为什么要将异常/错误处理放在第一位呢?那是因为这样我们就不用担心因前面中间件短路而导致捕获不到整个应用程序所有异常信息。

  ●UseStaticFiles(静态文件)中间件在管道中提前调用,方便它可以处理请求和短路,而无需通过剩余中间组件。也就是说静态文件中间件不用经过UseAuthentication(身份验证)检查就可以直接访问,即可公开访问由静态文件中间件服务的任何文件,包括下的文件。

  经过上面描述,大家都了解中间件顺序的重要性了吧。以下示例演示中间件的排序,其中静态文件的请求在响应压缩中间件之前由静态文件中间件进行处理。静态文件不会按照中间件的顺序进行压缩。可以压缩来自 UseMvcWithDefaultRoute的 MVC 响应。示例:

  ●Use:Use方法可使管道短路(即不调用 next 请求委托)。第二节点有示例代码演示。

  ●Run:Run是一种约定,并且某些中间件组件可公开在管道末尾运行的Run[Middleware]方法。第二节点有示例代码演示。

  ●Map:Map扩展用作创建管道分支。Map*给请求路径的匹配项来创建请求管道分支。如果请求路径以给自定义路径开头,则执行分支。

  由上面可以了解到当使用Map方法时,将从HttpRequest.Path中删除匹配的路径段,并针对每个请求将该路径追加到HttpRequest.PathBase。

  MapWhen基于给定谓词的结果创建请求管道分支。FuncHttpContext, bool类型的任何谓词均可用于将请求映射到管道的新分支(HandleBranch)。在以下示例中,谓词用于检测查询字符串变量branch是否存在:

  虽然Core为我们提供了一组丰富的内置中间件组件,但在某些情况下,你可能需要写入自定义中间件。

  因为中间件是在应用程序启动时构建的,而不是每个请求时构建,所以在每个请求期间,中间件构造函数使用的范围内生命周期服务不与其他依赖关系注入类型共享。如果您必须在中间件和其他类型之间共享作用域服务,请将这些服务添加到Invoke方法的签名中。Invoke方法可以接受由依赖注入(DI)填充的其他参数。示例:


最新文章
热门文章
本港开奖直播| 香港财神爷爷图库图源| 大红鹰心水论坛| 管家婆资料大全百度| 精准杀肖公式全年无错| 香港马经全年历史图库| 状元红| 中马堂图库| 辉哥手机免费图库| 权威彩经一码三中三|