淘先锋技术网

首页 1 2 3 4 5 6 7

中间件

中间件是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求交给下一个组件、并在管道中调用下一个组件之前和之后执行某些操作。请求委托被用来建立请求管道,请求委托处理每一个 HTTP 请求。

请求委托通过使用 IApplicationBuilder 类型的 Run、Map 以及 Use 扩展方法来配置,并在 Startup 类中传给 Configure 方法 。每个单独的请求委托都可以被指定为一个内嵌匿名方法,或其定义在一个可重用的类中。这些可重用的类被称作 中间件 或 中间件组件。每个位于请求管道内的中间件组件负责调用管道中下一个组件,或适时短路调用链。
ASP.NET 请求管道由一系列的请求委托所构成,它们一个接着一个被调用。Configure 方法 使用 IApplicationBuilder 来使用中间件,有Use 、Map、Run 三种使用方式:Use 使用中间件配置请求管道,Map 管道分支,Run 管道短路。

  • 可同时被访问和请求。
  • 可以处理请求后,然后将请求传递给下一个中间件。
  • 可以处理请求后并使管道短路。
  • 可以处理传出响应。
  • 中间件是按照添加的顺序执行的。

ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
在这里插入图片描述
用 Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不调用 next 参数使管道短路。当委托不将请求传递给下一个委托时,它被称为“让请求管道短路”。 通常需要短路,因为这样可以避免不必要的工作。 例如,静态文件中间件可以处理对静态文件的请求,并让管道的其余部分短路,从而起到终端中间件的作用。Run 委托不会收到 next 参数。 第一个 Run 委托始终为终端,用于终止管道。 Run 是一种约定。 某些中间件组件可能会公开在管道末尾运行的 Run[Middleware] 方法。Map 扩展用作约定来创建管道分支。 Map 基于给定请求路径的匹配项来创建请求管道分支。 如果请求路径以给定路径开头,则执行分支。

在这里插入图片描述

内置中间件

中间件描述顺序
身份验证:Authentication提供身份验证支持。在需要 HttpContext.User 之前。 OAuth 回叫的终端。
授权:Authorization提供身份验证支持。紧接在身份验证中间件Authentication之后。
Cookie 策略:Cookie Policy跟踪用户是否同意存储个人信息,并强制实施 cookie 字段(如 secure 和 SameSite)的最低标准。在发出 cookie 的中间件之前。 示例:身份验证、会话、MVC (TempData)。
CORS配置跨域资源共享。在使用 CORS 的组件之前。 由于此错误,UseCors 当前必须在 UseResponseCaching 之前运行。
诊断:Diagnostics提供新应用的开发人员异常页、异常处理、状态代码页和默认网页的几个单独的中间件。在生成错误的组件之前。 异常终端或为新应用提供默认网页的终端。
转接头:Forwarded Headers将代理标头转发到当前请求。在使用已更新字段的组件之前。 示例:方案、主机、客户端 IP、方法。
运行状况检查 :Health Check检查 ASP.NET Core 应用及其依赖项的运行状况,如检查数据库可用性。如果请求与运行状况检查终结点匹配,则为终端。
标头传播:Header Propagation将 HTTP 标头从传入的请求传播到传出的 HTTP 客户端请求中。
HTTP 方法重写:HTTP Method Override允许传入 POST 请求重写方法。在使用已更新方法的组件之前。
HTTPS 重定向:HTTPS Redirection将所有 HTTP 请求重定向到 HTTPS。在使用 URL 的组件之前。
HTTP 严格传输安全性 (HSTS):HTTP Strict Transport Security (HSTS)添加特殊响应标头的安全增强中间件。在发送响应之前,修改请求的组件之后。 示例:转接头、URL 重写。
MVC用 MVC/Razor Pages 处理请求。如果请求与路由匹配,则为终端。
OWIN与基于 OWIN 的应用、服务器和中间件进行互操作。如果 OWIN 中间件处理完请求,则为终端。
响应缓存:Response Caching提供对缓存响应的支持。在需要缓存的组件之前。 UseCORS 必须在 UseResponseCaching 之前。
响应压缩:Response Compression提供对压缩响应的支持。在需要压缩的组件之前。
请求本地化:Request Localization提供本地化支持。在对本地化敏感的组件之前。
终结点路由:Endpoint Routing定义和约束请求路由。用于匹配路由的终端。
SPA通过返回单页应用程序 (SPA) 的默认页面,在中间件链中处理来自这个点的所有请求在链中处于靠后位置,因此其他服务于静态文件、MVC 操作等内容的中间件占据优先位置。
会话:Session提供对管理用户会话的支持。在需要会话的组件之前。
静态文件:Static Files为提供静态文件和目录浏览提供支持。如果请求与文件匹配,则为终端。
URL 重写:URL Rewrite提供对重写 URL 和重定向请求的支持。在使用 URL 的组件之前。
WebSockets启用 WebSockets 协议。在接受 WebSocket 请求所需的组件之前。

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

  • 异常/错误处理

    • 当应用在开发环境中运行时:
      • 开发人员异常页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。
      • 数据库错误页中间件报告数据库运行时错误。
    • 当应用在生产环境中运行时:
      • 异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。
      • HTTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。
  • HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。

  • 静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。

  • Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。

  • 用于路由请求的路由中间件 (UseRouting)。

  • 身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。

  • 用于授权用户访问安全资源的授权中间件 (UseAuthorization)。

  • 会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。

  • 用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。

下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道。 在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。 你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。
在这里插入图片描述
参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0