2017-10-06 82 views
3

目前我们正在写与DOTNET核心的Web应用程序2.C#DOTNET核心2遍数据

我们实际上创建某种多主机平台的,我们可以注册基于新客户该网址传递给我们的应用程序。

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

其实我们想要做的是从数据库中拉一个对象,并检查它是否存在,如果是,我们要调用的控制方法,使访问该对象,如果不存在的话,我们真的想放弃并显示错误页面。

我们已经完成创建一个过滤器/中间件正是这么做的,但我们不能想出一个办法来访问,我们已经拉在控制器方法中我们的过滤器/中间件的对象。

有实际上是这样做的任何文件?

其实我试图从弄明白: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware?tabs=aspnetcore2x https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

但他们没有描述的方式来做到这一点,只有真正做一些事情前/后动作。

回答

4

您可以将对象添加到使用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); 
    } 
} 

再后来就在你的操作方法,你可以阅读值:

3

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

注意:如果你传递的方法调用,而不是控制代理对象,不要忘记[FromServices]属性来标记它。

另一种方式是添加所述对象到所述请求的项目属性。但是当你读它,你需要从object投放到实际的类。