C#dotnet core 2将数据从中间件/过滤器传递给控制器​​方法

Chr*_*itt 7 c# .net-core asp.net-core-2.0

目前我们正在编写一个带有dotnet core 2的Web应用程序.

我们实际上创建了一种多主机平台,我们可以根据传递给我们应用程序的URL注册新客户端.

但是目前我们想要创建一个中间件/过滤器来验证我们的客户端.

实际上我们想要做的是从数据库中提取一个对象并检查它是否存在,如果是,我们要调用控制器方法并使对象可访问,如果它不存在,我们实际上想要中止并显示错误页.

我们已经完成的是创建了一个过滤器/中间件,它完全可以实现,但我们无法找到一种方法来访问我们已经在控制器方法内部的过滤器/中间件中提取的对象.

实际上有没有这方面的文件?

我实际上试图通过以下方式解决这个问题:https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware ? tabs = aspnetcore2x https://docs.microsoft.com/en-us/aspnet/芯/ MVC /控制器/过滤器

但他们没有描述一种方法,只是在行动之前/之后实际做某事.

Dav*_*idG 14

您可以将对象添加到HttpContext.Items文档所声明的上下文中:

Items集合是存储仅在处理一个特定请求时所需的数据的良好位置.每次请求后都会丢弃集合的内容.Items集合最适合用作组件或中间件在请求期间在不同时间点操作时进行通信的方式,并且没有直接传递参数的方法.

例如,在您的中间件中:

public class MySuperAmazingMiddleware
{
    private readonly RequestDelegate _next;

    public MySuperAmazingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        var mySuperAmazingObject = GetSuperAmazingObject();

        context.Items.Add("SuperAmazingObject", mySuperAmazingObject );

        // Call the next delegate/middleware in the pipeline
        return this._next(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的操作方法中,您可以读取值:

var mySuperAmazingObject = (SuperAmazingObject)HttpContext.Items["mySuperAmazingObject"];
Run Code Online (Sandbox Code Playgroud)