asp.net - HttpContextAccessor 线程安全吗?

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

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

  • 为服务注入(inject)的 IHttpContextAccessor(和 HttpContextAccessor)如下:httpContextAccessor.HttpContext
  • 或者通过 Controller 的属性如下: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/

    相关文章:

    asp.net - SlowCheetah 未在 CI 服务器上生成转换后的配置文件

    c# - 未检测到复选框 == true

    javascript - 如何从父页面获取查询字符串?

    c# - 模型值在回发期间丢失

    c# - 从运行.Net Core的不同容器访问Docker卷文件

    asp.net - 读取 ASP.NET Core 中的环境变量

    c# - 如何在 Entity Framework Core 中创建基类和派生类组合的复合键

    angular - 在 azure 中部署时,未在 cookie 中设置防伪 token

    c# - 将结构数组从 C#(.NET Core) 传递到 C++(unamnaged)

    docker - 在 dotnet SDK 和 Docker 容器上