IIS的单个Web请求是否保留在单个线程上?

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

问题是,一个请求是否与一个线程匹配? 即我可以在我的代码中的任何地方假设我可以向IEnumerable添加项目,并且它们将在请求结束时正确地组合在一起。

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

只有某些点可以/将会这样做。 我不记得他们的头脑是什么 – 现在正在寻找参考……

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

您可能最好使用Context.Items而不是线程存储 – 这是每个请求。 您无需担心服务器正在使用其线程执行的操作。

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

我会考虑使用ELMAH和/或log4net来获得你需要的东西,因为它很简单易用,现在使用NuGet包管理器更简单。

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

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

有时候使用已经过测试和配置的代码来完成你需要的环境而不是自己编写环境是很棒的,但是嘿,那就是你的电话。

如果您准备丢失已经累积的日志数据,那么无论线程安全如何,您都可以等到请求结束时写入日志。 如果记录每个事件对您来说很重要,那么我建议您在事件发生时将事件写入日志。