【问题标题】:Does a single web request to IIS stay on a single thread?对 IIS 的单个 Web 请求是否停留在单个线程上?
【发布时间】:2011-06-24 02:50:01
【问题描述】:

我想编写一个日志记录 http 模块,该模块在请求执行时将单个请求的日志事件列表存储在线程本地存储中。在 End_Request 上,我想将所有事件写回持久存储。

问题是,一个请求会匹配一个线程吗? IE。我可以从我的代码中的任何地方假设我可以将项目添加到 IEnumerable 并且它们将在请求结束时正确地放在一起。

【问题讨论】:

    标签: c# iis thread-safety threadpool


    【解决方案1】:

    没有。 ASP.NET 在处理请求时可能会切换线程。这称为线程敏捷性。

    只有在某些方面它可以/将会做到这一点。我不记得他们在我的脑海中是什么 - 现在正在寻找参考......

    但简短的回答是:您不能依赖在整个请求期间都可以访问同一个线程本地存储。

    【讨论】:

    • ASP.Net 请求不能在线程之间跳转。做到这一点的唯一方法是使用 .Net 并不真正支持的 Fibers。
    • @SLaks:不正确。在管道中的某些点,工作线程可以停止处理特定请求,并且它将被另一个线程拾取(诚然,这不会在中间方法或类似的情况下发生)。尝试搜索“asp.net thread agility”以获取大量轶事证据。我试图找到更明确的东西,我知道我在过去的某个地方看到过它的正确记录......
    • 你说的是异步页面吗?这是一个单独的功能。
    • stackoverflow.com/questions/1643987/… 有一些关于它的链接和信息。
    【解决方案2】:

    session 在请求期间保持不变。为什么不使用它?

    【讨论】:

    • 会话不是按请求进行的。
    【解决方案3】:

    使用Context.Items 而不是线程存储可能会更好 - 这是每个请求。您无需担心服务器会以这种方式处理其线程。

    【讨论】:

      【解决方案4】:

      我会考虑使用 ELMAH 和/或 log4net 来完成您需要完成的工作,因为它使用简单,现在使用 NuGet 包管理器安装更简单。

      http://code.google.com/p/elmah/

      http://logging.apache.org/log4net/

      有时最好使用已经针对您需要的环境进行测试和配置的代码,而不是自己编写代码,但这是您的决定。

      【讨论】:

        【解决方案5】:

        如果您准备好可能丢失您积累的日志数据,那么您可以等到请求结束后再写入日志,而不考虑线程安全。如果记录每个事件对您很重要,那么我建议您在事件发生时将事件写入日志。

        【讨论】:

        • 拉撒路,这就是我打算做的。我的问题是针对在请求结束之前将日志事件存储在内存中的哪个位置。
        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        相关资源
        最近更新 更多