我想编写一个日志记录http模块,该模块在请求执行时为线程本地存储中的单个请求存储日志事件列表。在End_Request上,我想将所有事件写回持久存储。
问题是,一个请求是否与一个线程匹配?即我可以在我的代码中的任何地方假设我可以将项目添加到IEnumerable中,并且它们将在请求结束时正确地组合在一起。
答案 0 :(得分:5)
没有。 ASP.NET可以在处理请求时切换线程。这称为线程敏捷性。
只有某些点可以/将会这样做。我不记得他们的头脑是什么 - 现在正在寻找参考......
但简短的回答是 NO :您不能依赖于整个请求期间可访问的同一线程本地存储。
答案 1 :(得分:4)
您可能最好使用Context.Items而不是线程存储 - 这是每个请求。你不需要担心服务器正在用它的线程做什么。
答案 2 :(得分:0)
session在请求期间保持不变。为什么不使用它?
答案 3 :(得分:0)
我会考虑使用ELMAH和/或log4net来获取您需要的东西,因为它使用起来很简单,现在使用NuGet包管理器更容易安装。
http://code.google.com/p/elmah/
http://logging.apache.org/log4net/
有时候使用已经过测试和配置的代码非常适合您需要的环境,而不是自己动手,但是嘿,这就是您的召唤。
答案 4 :(得分:0)
如果您准备可能丢失已累积的日志数据,那么无论线程安全如何,您都可以等到请求结束时写入日志。如果记录每个事件对您来说很重要,那么我建议您在事件发生时将事件写入日志。