如何在ASP.net 5中使用Controller外部的会话?

时间:2015-12-28 17:02:19

标签: c# asp.net asp.net-core

以下是我现在所拥有的:

public bool TokenCorrect()
    {
        var token = HttpContext.Session.GetInt32("Token");

        return false;
    }

错误:

  

非静态字段方法或属性

需要对象引用

它适用于控制器,但我想在其他类中使用它。

3 个答案:

答案 0 :(得分:7)

在ASP.NET 5中获取HttpContext,您将对IHttpContextAccessor采用构造函数依赖项并将其注入组件中。 然后,您需要确保会话在使用之前可用。 如果使用下面的示例

,那么根据请求确定组件的范围是很重要的
apiRouter.use(function(req, res, next) {

  var token = req.body.token || req.query.token || req.headers['x-access-token'];

  if (token) {
    jwt.verify(token, secret, function(err, decoded) {
      if (err) {
        res.status(403).send({
            success: false,
            message: 'Failed to authenticate token.'
        });
      } else {
        req.decoded = decoded;
        next(); 
      }
    });
  } else {
    res.status(403).send({
        success: false,
        message: 'No token provided.'
    });
  }
});

答案 1 :(得分:1)

完全不建议这样做但您可以使用HttpContext.Current静态属性来获取当前的HTTP上下文:

var token = HttpContext.Current.Session.GetInt32("Token");

请记住,这会导致单独测试代码非常困难,并且尝试依赖于非特定于HTTP上下文的类中的ASP.NET会话是非常糟糕的做法。另一方面,你可以很好地从ASP.NET MVC控制器中获取这个值,并将其作为参数传递给另一个类。

答案 2 :(得分:1)

HttpContext类具有静态Current属性,该属性引用当前上下文(如果有,请参见下文)。所以像这样:

HttpContext.Current.Session.GetInt32("Token")

但是:理想情况下,不应该依赖于UI对象外部。 (你甚至不应该依赖 in 你的控制器,但这可能是完全取决于你的需求的另一个故事。)除非你正在构建的类本身是一个接口驱动的包装器在控制器中使用的会话使它们更易于测试......其他类不应该依赖于Web上下文。

更新:看起来这在MVC 6中有所改变。看看this link。从本质上讲,HttpContext属性中的控制器现在可以使用Context个对象。因此,在控制器中,您可以使用以下内容:

Context.Session.GetInt32("Token")

可测试性当然仍然是一个问题,尽管它已经变得更好了。

对于非控制器类,您可以将上下文对象注入IHttpContextAccessor。当然,注入它是依赖注入器的关注点。我并不完全熟悉MVC 6中的变化,但总的来说,将它作为依赖项注入绝对是可行的方法。 (事实上​​,如果它作为依赖项可以注入控制器,那么你不再需要创建一个包装类,因为框架本质上已经为你做了。)