【发布时间】:2011-06-24 02:50:01
【问题描述】:
我想编写一个日志记录 http 模块,该模块在请求执行时将单个请求的日志事件列表存储在线程本地存储中。在 End_Request 上,我想将所有事件写回持久存储。
问题是,一个请求会匹配一个线程吗? IE。我可以从我的代码中的任何地方假设我可以将项目添加到 IEnumerable 并且它们将在请求结束时正确地放在一起。
【问题讨论】:
标签: c# iis thread-safety threadpool
我想编写一个日志记录 http 模块,该模块在请求执行时将单个请求的日志事件列表存储在线程本地存储中。在 End_Request 上,我想将所有事件写回持久存储。
问题是,一个请求会匹配一个线程吗? IE。我可以从我的代码中的任何地方假设我可以将项目添加到 IEnumerable 并且它们将在请求结束时正确地放在一起。
【问题讨论】:
标签: c# iis thread-safety threadpool
没有。 ASP.NET 在处理请求时可能会切换线程。这称为线程敏捷性。
只有在某些方面它可以/将会做到这一点。我不记得他们在我的脑海中是什么 - 现在正在寻找参考......
但简短的回答是否:您不能依赖在整个请求期间都可以访问同一个线程本地存储。
【讨论】:
session 在请求期间保持不变。为什么不使用它?
【讨论】:
使用Context.Items 而不是线程存储可能会更好 - 这是每个请求。您无需担心服务器会以这种方式处理其线程。
【讨论】:
我会考虑使用 ELMAH 和/或 log4net 来完成您需要完成的工作,因为它使用简单,现在使用 NuGet 包管理器安装更简单。
http://code.google.com/p/elmah/
http://logging.apache.org/log4net/
有时最好使用已经针对您需要的环境进行测试和配置的代码,而不是自己编写代码,但这是您的决定。
【讨论】:
如果您准备好可能丢失您积累的日志数据,那么您可以等到请求结束后再写入日志,而不考虑线程安全。如果记录每个事件对您很重要,那么我建议您在事件发生时将事件写入日志。
【讨论】: