await延续执行时HttpContext.Current值不一致的原因是什么
现象原因
这个问题的根源是ASP.NET内置AspNetSynchronizationContext的设计逻辑:
- 当请求进入ASP.NET处理管道时,
AspNetSynchronizationContext就会和该次请求的原始HttpContext实例绑定,这个绑定关系是固定的,不会因为你后续手动修改HttpContext.Current的值发生变更。 await操作默认会捕获当前线程的同步上下文,等异步任务完成后,延续代码会回到捕获的同步上下文上执行。此时AspNetSynchronizationContext会主动将当前线程的HttpContext.Current重置为它绑定的原始请求HttpContext,直接覆盖了你await之前手动赋值的自定义HttpContext实例,所以await之后的比对结果为False。Task.Run的委托是在线程池线程上执行的,线程池线程默认没有AspNetSynchronizationContext,所以不会拿到你设置的HttpContext,这里输出False和你的预期一致。
补充说明
如果你需要在异步流程中传递自定义的HttpContext实例,不要依赖修改全局HttpContext.Current实现,你可以通过闭包捕获变量、或者用AsyncLocal<T>存储自定义上下文的方式来完成。
内容的提问来源于stack exchange,提问作者Charalampos Detsis
相关产品推荐
相关产品推荐

