HttpContextAccessor线程安全吗?

时间:2018-10-29 14:49:17

标签: asp.net asp.net-core .net-core

有两种通过以下方式访问用户HttpContext的正常方法:

    为服务注入的
  • IHttpContextAccessor(和HttpContextAccessor):httpContextAccessor.HttpContext
  • 或这样访问控制器的属性:this.HttpContext

在我的代码库中,我们同时使用了两种情况。对于HttpContextAccessor的用法,我们主要将它们用于每个请求(例如日志记录,会话处理等)共享的公用单例服务中。我认为这应该是线程安全的,因为HttpContextAccessor应该知道如何处理它,但是我看到此推文使我失望:https://twitter.com/davidfowl/status/907248318538903553

到目前为止,看起来还不错,但是是否有任何线程安全性的确认?

1 个答案:

答案 0 :(得分:-1)

您混淆了两个不同的概念。线程安全仅与HTTP请求有切线关系,因为HTTP请求需要使用线程。就是这样。 HttpContext是基于请求范围的,因此在单个请求的上下文中,您不会流血,假设您只停留在一个线程中,或者所有运行线程都在该特定请求的上下文中运行。

当您开始触发在后台运行的线程(即在请求管道之外)时,事情就变得不妙了。在这种情况下,HttpContext可能存在或可能不存在,或者背景线程与原始线程可能不同。这就是线程不安全的地方。

长而短,HttpContext是否是线程安全的是一个错误的问题。相反,您需要询问在什么上下文中线程正在执行什么工作。如果您处于请求管道中,那么HttpContext将实际上是线程安全的,但这将需要捕获您触发的所有线程,这几乎抵消了使用多个线程的有用性。您也可以只在原始线程上完成所有工作。处理Web请求与台式机或移动应用程序不同。在后者中,您需要保持主线程或UI线程空闲,因此必须拆分线程。网络无法正常工作;所有线程都是瞬态的,服务于特定请求,然后返回到池中。