2010-12-08 22 views
0



J'ai utilisé this exemple pour implémenter le service WCF qui déclenche des événements (en utilisant le rappel) à tous les clients lorsqu'un événement se produit sur le service.
Le problème est que cet exemple ne fonctionne que lorsque l'instance de service est percall. Je souhaite utiliser une instance unique, mais cela ne fonctionnera pas.
Il déclenche tous les événements sur le dernier client abonné.
S'il vous plaît aider.WCF Percall et une instance unique

Répondre

2

Grâce à Chris, j'ai trouvé this exemple montrant comment gérer les abonnés de rappel de multiplier en utilisant InstanceContextMode.Single.
L'exemple montrant comment gérer un dictionnaire (la liste est également possible) des canaux de rappel. Igal.

3

L'échantillon a InstanceContextMode.PerSession, et non InstanceContextMode.PerCall. Chaque client abonné est associé à une instance distincte de MyService. Chacune de ces instances possède un champ de membre _callbackInstance qui contient la référence au canal de rappel de son client particulier. Toutes les instances de MyService sont associées dans un "chat room" via l'événement statique Broadcast, et lorsqu'un client particulier dit quelque chose, le code parcourt la liste d'invocation de l'événement statique à diffuser vers chaque client abonné. Si vous faites MyService un singleton, _callbackInstance contient uniquement le canal de rappel du dernier client abonné, ce qui explique pourquoi vous voyez le comportement que vous décrivez. Pour que la classe de service fonctionne correctement en tant qu'instance singleton, vous devez remplacer _callbackInstance par une collection contenant tous les canaux de rappel pour les clients abonnés et gérer les ajouts et les suppressions de cette collection vous-même lorsque les clients arrivent et gauche. La diffusion impliquerait alors l'itération de cette collection. L'inconvénient de cette approche est que plusieurs clients peuvent appeler le service simultanément, et vous devez donc explicitement synchroniser l'accès aux membres de la classe afin de garantir la sécurité des threads et un comportement correct.

+0

Merci, vous avez vraiment aidé. C'est une réponse très professionnelle. Lisez ma réponse pour voir ce que j'ai fait. – Igal