我正在構建將在公司內部使用的ASP.NET Web服務。異常和跟蹤/審計日誌記錄將由Web服務類以及Web服務將調用的業務對象執行。日誌記錄由內部開發的日誌助手類的實例處理。日誌幫助程序必須是一個實例,因爲它跟蹤了狀態和用於將日誌消息關聯到組中的引用guid。如何在asp.net web服務中存儲對象以便業務對象可以引用該對象?
在過去,我們通過使用方法參數將對日誌幫助器實例的引用傳遞給類來處理這種情況。我試圖找到一種可靠的方法來找到一種方法來存儲和訪問整個調用實例,而不必明確地通過它。
我試圖在Web服務調用的早期階段將實例存儲在HTTPContext中。當我的業務對象稍後在調用期間需要它時,它們將作爲基類的一個屬性來訪問它,以便繼承我所有的對象。
最初我嘗試將實例存儲在Web服務的Context.Cache中。這似乎工作,我的研究使我相信Cache將是線程安全的。直到我從超過3個併發會話開始調用Web服務時,記錄器的實例纔會從呼叫共享到呼叫,而不是爲每個呼叫重新創建。我嘗試了Context.Application,發現與Cache存儲非常相似的結果。
我能夠通過Context.Session找到可用的解決方案。這要求我在每個方法的屬性中使用EnableSession = true,但它似乎確保每個調用都保持實例唯一。我不需要跟蹤通話間的數據,所以我不會將會話cookie存儲在客戶端空間中。
會話是我需要的最佳存儲點嗎?這似乎有點沉重,因爲我不需要跟蹤通話之間的會話。我願意接受建議或批評。我確定有人會建議使用內置的Trace記錄或Elmah等系統。這些可能是未來的一個選擇,但現在我沒有時間走下去。
更新:我應該澄清,此服務將需要在.Net Framework 2.0上運行。我們正在轉移到3.5/4.0,但我們目前的生產服務器是最高2.0的Win2000。
順便說一句,術語「對象實例」是多餘的。一個對象是一個類的實例。 – 2010-08-09 19:33:10
感謝您更新問題。 「一個對象的實例」是我成長起來的東西,但絕不會試圖爭辯正確。 – 2010-08-09 20:27:18