将数据传递到链下游的中间件

Pass data to middleware further down the chain

当我将中间件注册为请求管道的一部分时,我如何通过中间件链传递数据。 (最终可在 MVC 控制器操作中访问)

例如,我已经实现了自定义中间件来验证我的请求,但我如何才能将验证数据(例如验证结果和附加数据)传递到中间件链下 - 最终想要访问数据来自 MVC 控制器操作,以及用于根据身份验证结果限制访问的自定义 MVC 操作过滤器。

有没有什么地方可以根据每个请求存储自定义数据,并稍后在请求链中访问它?

您可以使用 HttpContext.Items 集合来存储请求生命周期内的数据。它的主要用例是在组件(例如中间件和控制器)周围传递数据。添加和阅读项目很容易:

写入:

context.Items["AuthData"] = authData;

阅读:

var authData = (AuthData)context.Items["AuthData"];

有关详细信息,请参阅 ASP.NET docs

您可以将自定义数据存储在 IOwinContext 对象中。 IOwinContext 对象可以从中间件的 Invoke 函数访问。

设置

context.Set<T>("key", obj);

得到

var obj = context.Get<T>("key");