2011-02-09 17 views
5

我想編寫一個記錄http模塊,它在請求執行時在線程本地存儲中存儲單個請求的日誌事件列表。在End_Request上,我想將所有事件寫回持久存儲。對IIS的單個Web請求是否停留在單個線程上?

問題是,一個請求匹配一個線程?即我可以從我的代碼中的任何位置假設我可以將項添加到IEnumerable中,並且它們將在請求結束時正確地結合在一起。

回答

5

編號ASP.NET在處理請求時可能會切換線程。這被稱爲線程敏捷性。

只有某些點在那裏可以/會做到這一點。我不記得他們是什麼在我頭上 - 尋找一個參考現在...

但簡短的回答是沒有:你不能依靠相同的線程本地存儲可訪問在整個請求期間。

+0

這是不正確的。 – SLaks 2011-02-09 12:48:41

+1

@SLaks:謹慎地闡述? – LukeH 2011-02-09 12:51:27

+0

ASP.Net請求不能在線程之間跳轉。要做到這一點的唯一方法是使用Fibre,而.Net並不真正支持。 – SLaks 2011-02-09 12:52:21

0

session仍然是請求的持續時間是恆定的。爲什麼不使用它?

4

你可能會更好使用Context.Items而不是線程存儲 - 這是每個請求。你不需要擔心服務器正在用它的線程做什麼。

0

我想看看,也許使用ELMAH和或log4net的得到你需要做的事情,因爲它是使用簡單,現在連簡單的使用NuGet包管理器安裝。

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

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

有時它是偉大的使用已經測試和配置您需要,而不是滾動您自己的環境的代碼,但嘿,這是你的電話。

0

如果您正在準備可能失去你所積累的日誌數據,那麼你可以等到請求結束寫入日誌,不論線程安全的。如果每個事件都被記錄對你來說很重要,那麼我建議你在事件發生時寫日誌。

相關問題