有两种通过以下方式访问用户HttpContext的正常方法:
httpContextAccessor.HttpContext
this.HttpContext
在我的代码库中,我们同时使用了两种情况。对于HttpContextAccessor
的用法,我们主要将它们用于每个请求(例如日志记录,会话处理等)共享的公用单例服务中。我认为这应该是线程安全的,因为HttpContextAccessor
应该知道如何处理它,但是我看到此推文使我失望:https://twitter.com/davidfowl/status/907248318538903553
到目前为止,看起来还不错,但是是否有任何线程安全性的确认?
答案 0 :(得分:-1)
您混淆了两个不同的概念。线程安全仅与HTTP请求有切线关系,因为HTTP请求需要使用线程。就是这样。 HttpContext是基于请求范围的,因此在单个请求的上下文中,您不会流血,假设您只停留在一个线程中,或者所有运行线程都在该特定请求的上下文中运行。
当您开始触发在后台运行的线程(即在请求管道之外)时,事情就变得不妙了。在这种情况下,HttpContext可能存在或可能不存在,或者背景线程与原始线程可能不同。这就是线程不安全的地方。
长而短,HttpContext
是否是线程安全的是一个错误的问题。相反,您需要询问在什么上下文中线程正在执行什么工作。如果您处于请求管道中,那么HttpContext
将实际上是线程安全的,但这将需要捕获您触发的所有线程,这几乎抵消了使用多个线程的有用性。您也可以只在原始线程上完成所有工作。处理Web请求与台式机或移动应用程序不同。在后者中,您需要保持主线程或UI线程空闲,因此必须拆分线程。网络无法正常工作;所有线程都是瞬态的,服务于特定请求,然后返回到池中。