我们可以回到.net核心中间件管道吗

时间:2018-06-30 16:54:29

标签: asp.net-core

我的问题是我们可以回到中间件流水线来看一个例子

我们正在执行中间件1,中间件2,中间件3和中间件3。我希望Middleware1重新执行,然后再控制回Middleware3,我们可以这样做吗?

预先感谢

1 个答案:

答案 0 :(得分:2)

不,您不能这样做。中间件在管道中被调用。这意味着,将启动一个中间件,该中间件将继续传递到管道中的下一个中间件,然后再传递到下一个中​​间件,依此类推。最终,随着管道的完成,每个中间件都有一种事后的方式。

通常如下所示:

Request
|            → Middleware1
|              | run
|              | next()     → Middleware2
|              |              | run
|              |              | next()     → Middleware3
|              |              |              | run
|              |              |              | next()     → {}
|              |              |              | run after
|              |              |              | return ↵
|              |              | ←
|              |              | run after
|              |              | return ↵
|              | ←
|              | run after
|              | return ↵
| ←
| ⇒ Send response

由于这是一条严格的管道,只能沿一个方向运行,因此您不能随意跳来跳去。您只有机会调用管道中的下一个中间件或返回。

可以要做的是多次调用以下管道。例如,当发生错误时,StatusCodePages中间件执行此操作以重新执行状态代码页的管道:

Request
|            → StatusCodePagesMiddleware
|              | run
|              | next()     → Pipeline
|              |              | … throw an error
|              | ← catch exception
|              | run after
|              | adjust parameters
|              | next()     → Run pipeline again with modified parameters do display error page
|              | return ↵
| ←
| ⇒ Send response

请注意,这是一件非常特殊的事情,仅由于StatusCodePages中间件通常注册得很早并且因为它想重新运行完整管道,才起作用。

如果您希望对此进行更好的控制,则您甚至不应该将逻辑拆分为多个中间件。拥有一个内部逻辑非常受控的单一中间件可能是一个更好的主意。例如,该逻辑可以是另一个管道,也可以是简单的控制流。