2010-12-08 128 views
0


我使用this示例來實現WCF服務,該服務在服務發生某些事件時向所有客戶端引發事件(使用回調)。
問題是這個例子只在服務實例是percall時才起作用。WCF percall和單實例

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Reentrant)] 

我想使用單個實例,但它不會工作。
它將所有事件觸發到最後訂閱的客戶端。
請幫忙。

回答

2

感謝克里斯,我發現this示例顯示如何使用InstanceContextMode.Single時處理乘法回調用戶。
該示例顯示瞭如何管理回調通道的字典(列表也是可能的)。 Igal。

3

樣品有InstanceContextMode.PerSession,而不是InstanceContextMode.PerCall。每個訂閱的客戶端都與一個獨立的MyService實例關聯。這些實例中的每個實例都有一個成員字段_callbackInstance,該成員字段保存對其特定客戶端的回調通道的引用。 MyService的所有實例都通過靜態事件Broadcast關聯到「聊天室」,並且當特定客戶端說出某些內容時,代碼遍歷靜態事件的調用列表以向每個訂閱的客戶端廣播。

如果您製作MyService單身人士,_callbackInstance只包含最後訂閱的客戶端的回叫通道,這就是您看到您描述的行爲的原因。

爲了使服務類作爲單例實例正常運行,您必須將_callbackInstance替換爲包含訂閱客戶端的所有回調通道的集合,並且在客戶端到達時自己管理這個集合中的添加和刪除操作離開。廣播將涉及迭代這個集合。這種方法的缺點是多個客戶端可能會同時調用服務,因此您需要明確地將訪問權限與類的成員同步,以確保線程安全和正確的行爲。

+0

謝謝,你真的幫了我。這是非常專業的答案。閱讀我的答案,看看我做了什麼。 – Igal 2010-12-08 12:42:31