在操作过滤器中访问 IHttpContextAccessor - 是否危险?

Mat*_*rts 3 asp.net-core

David Fowler 和 Damian Edwards 最近在 NDC London 发表了关于调试 asp.net core 2.0 的演讲。

在那次演讲中,他们警告控制器操作方法会执行异步操作,然后尝试访问IHttpContextAccessor,基本上它不是线程安全的。

我想知道这是否仅适用于操作方法,以及在异步操作过滤器中执行此操作是否安全(我在每个请求上都有类似的内容):

public class SampleAttribute : IAsyncActionFilter
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public LoggedInUserAttribute(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext filterContext, ActionExecutionDelegate next)
    {
        // Do something IO-bound more useful than...
        await Task.Delay(1000);

        // Then set something on the IHttpContextAccessor...
        _httpContextAccessor.HttpContext.Items["Something"] = "Hello";

        await next();
    }

}
Run Code Online (Sandbox Code Playgroud)

dav*_*owl 5

问题是关于从多个线程并行访问 HttpContext 。演讲中的示例描述了由于 IHttpContextAccessor,有时很难判断是什么在访问 HttpContext。您上面的代码工作正常,一个线程一次访问 HttpContext (尽管您在过滤器中永远不需要它,因为 MVC 通过适当的过滤器上下文将它提供给您)。