在动作过滤器中访问IHttpContextAccessor - 这很危险吗?

时间:2018-02-10 20:21:57

标签: asp.net-core

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

In that talk,他们警告控制器操作方法做异步,然后尝试访问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();
    }

}

1 个答案:

答案 0 :(得分:4)

问题是从多个线程并行访问HttpContext。谈话中的例子描述了由于IHttpContextAccessor,有时很难说出访问HttpContext的内容。你上面的代码工作正常,一个线程一次访问HttpContext(虽然你不需要在过滤器中,因为MVC通过适当的过滤器上下文给你)。