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();
}
}
答案 0 :(得分:4)
问题是从多个线程并行访问HttpContext。谈话中的例子描述了由于IHttpContextAccessor,有时很难说出访问HttpContext的内容。你上面的代码工作正常,一个线程一次访问HttpContext(虽然你不需要在过滤器中,因为MVC通过适当的过滤器上下文给你)。