2010-06-25 21 views
7

當請求到達WCF服務時,使用CallContext是安全的,使用一些調用特定的數據(例如在調用開始時使用鉤子:Inspector/ContextBoundObject)初始化它,然後在調用中重用它,並保證我訪問的數據始終是相同的數據?WCF中的CallContext

謝謝你,帕維爾

回答

7

如果,如果你不使用遠程處理或跨越一個AppDomain邊界你不使用它從檢查員那麼它應該是安全的,但那麼它可能是簡單的只使用一個線程靜態字段。將一個ThreadStaticAttribute放在一個靜態字段上,它將成爲每個線程中的一個單獨的存儲位置。

例如,如果您嘗試在IDispatchMessageInspector中設置值,那麼它將不起作用,因爲它們將在與請求分開的線程中運行。看看OperationContext,它將提供有關WCF請求的特定於呼叫的信息。您可以通過實施IExtension<OperationContext>並將它們添加到Extensions屬性來添加擴展名,以存儲自定義數據。 Here is a blog post,它描述瞭如何將自定義數據添加到OperationContext。

+0

謝謝。 我已經使用AOP和ContextBoundObject設計了我的解決方案。我在方面類方法SyncProcessMessage中設置了我的操作範圍屬性:CallContext.SetData(「workspaceManager」,_workspaceManager); 它應該是安全的嗎? – dragonfly 2010-06-25 12:15:54

+1

另一件讓我困擾的事情... 在asp .net web應用程序中,它說一個請求可以是服務器使用多個線程(類似於threds切換?)。在WCF主機環境中不一樣?當操作被處理時,他可以暫停任何一點,然後使用另一個線程恢復? – dragonfly 2010-06-25 12:23:50

+3

我工作的應用程序中的舊代碼是在WCF操作中將用戶特定的狀態存儲在CallContext中。由於我們的WCF服務託管在IIS中,因此不同的WCF操作在不同的線程上運行,這些線程從IIS線程池中重用。我們注意到某些操作在收集與其他用戶相關的用戶數據時發生的零星行爲。這是由於代碼錯誤地使用了CallContext而不是OperationContext,它僅在WCF操作的生命週期中有效。這是一個難以追查的問題,但切換到OperationContext解決了它。 – ozziepeeps 2011-08-15 16:01:53