从请求线程访问时,IHttpContextAccessor.HttpContext 会返回活动请求的 。IHttpContextAccessor.HttpContext 不应存储在字段或变量中。
请勿这样做:下面的示例将 存储在字段中,然后尝试在以后使用它。.
public class MyBadType
{
private readonly HttpContext _context;
public MyBadType(IHttpContextAccessor accessor)
{
_context = accessor.HttpContext;
}
public void CheckAdmin()
{
if (!_context.User.IsInRole("admin"))
{
throw new UnauthorizedAccessException("The current user isn't an admin");
}
}
}
上面的代码经常在构造函数中捕获 Null 或不正确的 HttpContext。
请这样做:下面的示例:
-
将 IHttpContextAccessor 存储在字段中。
-
在正确的时间使用 HttpContext 字段并检查是否存在 null。
public class MyGoodType
{
private readonly IHttpContextAccessor _accessor;
public MyGoodType(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public void CheckAdmin()
{
var context = _accessor.HttpContext;
if (context != null && !context.User.IsInRole("admin"))
{
throw new UnauthorizedAccessException("The current user isn't an admin");
}
}
}