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

C#dotnet core 2将数据从中间件/过滤器传递到控制器方法,c#,.net-core,asp.net-core-2.0,C#,.net Core,Asp.net Core 2.0,目前,我们正在使用DotnetCore2编写一个web应用程序 我们实际上创建了某种多主机平台,在这里我们可以根据传递给应用程序的url注册新的客户端 然而,目前我们想要创建一个中间件/过滤器来验证我们客户的 实际上,我们要做的是从数据库中提取一个对象并检查它是否存在,如果存在,我们要调用controller方法并使该对象可访问,如果它不存在,我们实际上要中止并显示一个错误页面 我们已经做的是创建一个过滤器/中间件,它确实做到了这一点,但是我们无法找到一种方法来访问我们已经在控制器方法中拉入过滤

目前,我们正在使用DotnetCore2编写一个web应用程序

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

然而,目前我们想要创建一个中间件/过滤器来验证我们客户的

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

我们已经做的是创建一个过滤器/中间件,它确实做到了这一点,但是我们无法找到一种方法来访问我们已经在控制器方法中拉入过滤器/中间件的对象

实际上是否有这样做的文档

事实上,我试着从以下方面来理解:

但是他们没有描述一种方法,只是在操作之前/之后实际做一些事情。

一种方法(不是说它是唯一的或最好的)是让DI注入对象的代理,您在中间件中设置对象的真实值,然后您可以从控制器中的代理访问它

注意:如果要在方法调用中传递代理对象而不是控制器,请不要忘记使用
[FromServices]
属性对其进行标记


另一种方法是将对象添加到RequestItems属性。但是,当您阅读它时,您需要从
对象
转换到实际的类。

您可以将对象添加到文档所述的上下文中:

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);
    }
}
随后,在动作方法中,您可以读取以下值:

var mySuperAmazingObject = (SuperAmazingObject)HttpContext.Items["mySuperAmazingObject"];

在中间件的
调用
中将请求从中间件重定向到控制器操作时,添加到
的对象在控制器上下文中消失。有什么办法保存它吗?@ibubi如果你有问题,那么你应该问一个适当的问题。评论不是询问的好地方,特别是当你甚至不投赞成票的时候……举个例子(一些代码)就好了。似乎是一个没有答案的模糊答案。