2012-11-22 24 views
3

我有一個傳輸大文件的WCF服務。Singleton vs PerSession vs PerCall狀態管理

目前我正在使用Singleton服務和來自我的類​​的實例列表來保存狀態並響應客戶端的傳輸進度請求等。

實例化類本身在需要時處理每個傳輸的新線程。

添加傳輸請求和請求進度的客戶端可能會同時斷開連接並隨機重新連接請求。

還有幾個不同的客戶可能想請求進行所有正在進行的傳輸。

一切都很好,但我相信有更好的方式做到這一點?

以某種方式在SQL中存儲狀態? 存儲狀態,因爲我目前正在做,並以某種方式重新連接到相同的實例?那麼如何從所有實例中獲取數據?

我希望你明白我的相當長的問題:)

回答

2

尤爾的解決方案將工作的偉大,如果只有一個侑WCF服務的實例。

當您使用loadballancing實例化多個實例時,那種方法將無法工作。
在這種情況下,您需要保持狀態是所有實例共有的某個位置。這可能是SQL,狀態服務器,另一個WCF服務,可以保持狀態,等

UPDATE
你需要生成每個文件轉院任務ID。然後Singletone可以將實例id與實例進行混合(我們稱之爲Executor)。
當客戶想要取得進展或取消轉移時,它會要求Singletone並提供任務ID。
Singletone應該使用任務ID將實際的Executor和Forvard客戶端的請求解析到正確的Executor。

因此,您將能夠根據需要實例化許多執行程序。客戶端不應該擔心Executor處理文件。通過客戶端應該瞭解的是任務ID。

+0

是的。目前它是單一實例。但使用SQL的多實例服務。我如何連接回正確的實例以獲取信息?例如中止傳輸請求。我如何從所有正在運行的實例中獲取信息?我連接到每一個或實現實例本身的信息查詢,根據存儲在SQL中的數據返回有關所有其他實例的信息? – Tanel

+1

我已經更新了我的答案。希望它現在可以幫助:) –

+0

因此,這樣基本上我會有1個單身人士,充當「執行者」之間的網關?這是做到這一點的一種方式。但使用PerCall模式託管的單個WCF服務可以實現相同的結果嗎?每個呼叫都會獲得新實例,並在需要時重定向?這樣做有什麼好處? P.S目前我所有的線程都有隻讀的GUID。 – Tanel