2016-05-03 53 views
2

我们使用自定义策略来检查某些数据库需求(令牌在数据库中持久化),并且需要会话信息,因此我注入了IHttpContextAccessor以使用HttpContext.Session。策略中的HttpContext错误

public TokenValidHandler(IHttpContextAccessor contextAccessor) 
{ 
    _httpContext = contextAccessor.HttpContext; 
} 

我可以看到:

  1. 我不正确HttpContext.Session检索,它引发InvalidOperationException
  2. 请求是不正确的:路径是空的,这应该是如'/首页/索引'

我在我的项目中重新使用SessionMiddleware,我可以看到用户会话已正确恢复到HttpContext中,但在我的策略中,我会得到错误的一个。 SessionMiddleware在MVC中间件之前正确添加。有任何想法吗 ?

解决方案(谢谢@JoeAudette) 保持accessor,直到你需要HttpContext。的

public TokenValidHandler(IHttpContextAccessor contextAccessor) 
{    
    _accessor = contextAccessor; 
} 

protected override void Handle(AuthorizationContext context, TokenValidRequirement requirement) 
{ 
    // Right context ... 
    var contextHttp = _accessor.HttpContext; 
} 
+3

不是获取在构造函数的背景下之前,尽量保持contextAccessor围绕并等待获取实际上下文,直到需要检查之前 –

+0

这就是解决方案:)对于这个问题,很多小时......也许您可以发布回复,以便将其标记为解决方案 –

+0

,我已将其作为回答发布。 –

回答

2

不是获取在构造函数的背景下,建议保持contextAccessor周围,等待获得实际的情况下,直到你需要检查它