.NET 性能最佳做法:请勿将IHttpContextAccessor.HttpContext存储在字段中

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