有两种正常的方法可以访问用户的 HttpContext,通过:
httpContextAccessor.HttpContext
this.HttpContext
在我的代码库中,我们使用了这两种情况。
HttpContextAccessor
的使用,我们将它们主要用于为每个请求共享的通用单例服务(例如日志记录、 session 处理等)。我认为这应该是线程安全的 HttpContextAccessor
应该知道如何处理它,但我看到这条推文让我失望:https://twitter.com/davidfowl/status/907248318538903553到目前为止看起来还不错,但是是否有任何确认它是线程安全的?
最佳答案
你混淆了两个不同的概念。线程安全仅与 HTTP 请求相关,因为 HTTP 请求需要使用线程。不过,差不多就是这样。 HttpContext 是请求范围的,因此在单个请求的上下文中,假设您只停留在一个线程上或所有操作线程在该特定请求的上下文中运行,您将不会发生溢出。
当你开始触发在后台运行的线程时,事情变得不稳定,即在请求管道之外。在这种情况下,HttpContext 可能存在也可能不存在,或者后台线程可能与原始线程不同。这就是线程不安全的来源。
多空,无论HttpContext
线程安全是错误的问题。相反,您需要询问在什么上下文中线程上正在执行什么工作。如果您在请求管道中,那么 HttpContext
实际上将是线程安全的,但这需要捕获您触发的所有线程,这几乎否定了使用多个线程的有用性。您不妨只在原始线程上完成所有工作。处理 Web 请求与桌面或移动应用程序不同。在后者中,您需要保持主线程或 UI 线程空闲,因此必须分离线程。网络不是这样工作的。所有线程都是 transient 的,服务于特定请求,然后返回到池中。
关于asp.net - HttpContextAccessor 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53048025/