从请求线程访问时,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");}}}