ASP.NET Core中的中间件和请求管道

请求管道

请求管道是一种机制,通过该机制可以处理从请求开始到响应结束的请求。管道指定应用程序应如何响应 HTTP请求。来自浏览器的请求经过管道并返回。组成管道的各个组件称为中间件。

什么是中间件

中间件是连接到请求管道以处理Web请求并生成响应的软件组件。每个中间件都会收到并处理从前一个中间件收到的请求。它可能决定调用管道中的下一个中间件,或将响应发送回先前的中间件(终止管道)。

怎么运行的

下图向我们展示了请求管道如何与中间件结合使用,如何在ASP.NET Core应用程序中工作

首先,Http请求(直接或通过外部Web服务器)到达应用程序。Kestrel Web服务器拾取该请求并创建httpContext 并将其传递给请求管道中的第一中间件

然后,第一个中间件接管,处理请求并将其传递给下一个中间件。一直进行到到达最后一个中间件为止。最后一个中间件将请求返回到先前的中间件,从而有效地终止请求管道。序列中的每个中间件都有第二次机会检查请求并在返回时修改响应

最后,回应达到 Kestrel,它将响应返回给客户端。请求管道中的任何中间件都可以通过不将请求传递给下一个中间件来终止请求管道

配置请求管道

要开始使用任何中间件,我们需要将其添加到请求管道中。这是在startup 类的 Configure 方法中进行的 。Configure 方法获取实例 IApplicationBuilder,我们可以使用它注册我们的中间件。

我们使用了 app.Run 注册我们的第一个中间件的方法,该中间件在执行时显示“来自中间件1的问候”。app.Run方法获取Httpcontext的实例。 我们可以使用HttpContext中的Response对象将一些消息写到HTTP 响应。

使用和运行配置中间件

Use和 Run 方法扩展允许我们注册内联中间件到请求管道。Run 方法添加终止中间件。Use方法添加了中间件,该中间件可能会调用管道中的下一个中间件。现在,我们使用 app.Run

app.Use获取两个参数。 一个是HttpContext,第二个是RequestDelegate,基本上是对下一个中间件的引用。现在,再次运行代码。消息“来自中间件1的问候”出现在浏览器上。 第二个中间件的消息没有出现。

这是因为调用下一个中间件是当前中间件的责任。我们可以通过调用下一个中间件的invoke方法来调用下一个中间件,在构造函数中给

现在,运行代码,我们能够看到两条消息。

现在,让我们添加另一个中间件,并在调用下一个中间件后添加一条消息

现在执行会发现中间件有第二次机会可以在回程中查看请求

执行顺序

中间件的执行顺序与在管道中添加中间件的顺序相同

定制中间件

在上一节中,我们使用了 app.Use 和 app.Run。创建中间件的另一种方法是使用类。不需要中间件类来实现任何接口或从任何类继承。但是,必须遵循两个特定规则

  1. 中间件类必须声明至少一个类型为参数的非静态公共构造函数 RequestDelegate 。实际上,我们所获得的是对管道中下一个中间件的引用。当我们调用此RequestDelegate实际上是在调用管道中的下一个中间件
  2. 中间件类必须定义一个名为Invoke的公共方法,该方法接受HttpContext并返回Task。这是在请求到达中间件时被调用的方法

创建自定义中间件

现在,让我们创建一个简单的类来演示这一点。我们将中间件命名为简单中间件

首先,在构造函数中,我们将获得对管道中下一个中间件的引用。 我们将其存储在局部变量_next

接下来,我们必须声明一个Invoke方法,该方法获取对HttpContext的引用。我们向响应写出一些消息,然后使用await _next(context)调用下一个中间件,并将其传递给HttpContext。

接下来,我们需要在请求管道中注册中间件。我们可以使用应用程序的UseMiddleware方法做到这一点,如下所示

将以上代码复制到Configure方法中运行,将在浏览器中看到来自简单中间件的消息。

扩展方式

我们可以创建一个扩展方法来简化中间件的注册。创建另一个类中间件扩展并创建Use简单中间件,如下所示。

现在可以使用app.Use简单中间件()代替app.UseMiddleware<简单中间件>()注册中间件。

运行结果当然时一样的

 

原文地址:https://www.cnblogs.com/yigegaozhongsheng/p/13878275.html