我想編寫一個記錄http模塊,它在請求執行時在線程本地存儲中存儲單個請求的日誌事件列表。在End_Request上,我想將所有事件寫回持久存儲。對IIS的單個Web請求是否停留在單個線程上?
問題是,一個請求匹配一個線程?即我可以從我的代碼中的任何位置假設我可以將項添加到IEnumerable中,並且它們將在請求結束時正確地結合在一起。
我想編寫一個記錄http模塊,它在請求執行時在線程本地存儲中存儲單個請求的日誌事件列表。在End_Request上,我想將所有事件寫回持久存儲。對IIS的單個Web請求是否停留在單個線程上?
問題是,一個請求匹配一個線程?即我可以從我的代碼中的任何位置假設我可以將項添加到IEnumerable中,並且它們將在請求結束時正確地結合在一起。
編號ASP.NET在處理請求時可能會切換線程。這被稱爲線程敏捷性。
只有某些點在那裏可以/會做到這一點。我不記得他們是什麼在我頭上 - 尋找一個參考現在...
但簡短的回答是沒有:你不能依靠相同的線程本地存儲可訪問在整個請求期間。
的session仍然是請求的持續時間是恆定的。爲什麼不使用它?
你可能會更好使用Context.Items而不是線程存儲 - 這是每個請求。你不需要擔心服務器正在用它的線程做什麼。
我想看看,也許使用ELMAH和或log4net的得到你需要做的事情,因爲它是使用簡單,現在連簡單的使用NuGet包管理器安裝。
http://code.google.com/p/elmah/
http://logging.apache.org/log4net/
有時它是偉大的使用已經測試和配置您需要,而不是滾動您自己的環境的代碼,但嘿,這是你的電話。
如果您正在準備可能失去你所積累的日誌數據,那麼你可以等到請求結束寫入日誌,不論線程安全的。如果每個事件都被記錄對你來說很重要,那麼我建議你在事件發生時寫日誌。
這是不正確的。 – SLaks 2011-02-09 12:48:41
@SLaks:謹慎地闡述? – LukeH 2011-02-09 12:51:27
ASP.Net請求不能在線程之間跳轉。要做到這一點的唯一方法是使用Fibre,而.Net並不真正支持。 – SLaks 2011-02-09 12:52:21