2010-09-14 8 views
3

J'ai essayé la question de différentes manières, vérifier mon profil pour les deux autres questions expliquant la difficulté que j'ai eu avec les approches que j'ai pris à ce scénario. Je les passerai ici.WCF serveur à client méthode de rappel avec la valeur de retour

J'ai besoin juste un exemple (C# préféré) d'un serveur appelant à un client (sur un canal NetTcp), le client calcule une réponse, et renvoie un résultat.

  • Le thread appelant du serveur est bloqué jusqu'à ce que le client envoie la réponse.
  • Le rappel du serveur est invité par un événement, tel qu'un minuteur, et non par un appel du client.
  • Le client n'a pas besoin de rappeler le serveur dans le contexte du rappel du serveur, il ne devrait donc pas y avoir de problèmes de blocage.
  • Le client peut prendre (et pour cet exercice, doit prendre) un ou plusieurs paramètres avec lesquels pour effectuer le calcul
  • le client peut retourner (et pour cet exercice, doivent retourner) un résultat non nul
  • L'approche utilisée devrait au moins être compatible, sinon mise en œuvre, avec la possibilité de gérer plusieurs clients à tour de rôle, y compris une fonctionnalité subscribe() et unsubscribe().
  • Ce ne devoirs, il est de servir d'exemple de la façon de construire un serveur abonné/éditeur basé sur WCF qui prend en charge (peu) de confiance des clients avec la communication client-serveur à faible latence sans vote et sans lancer des messages (sur la clôture)
  • Je suis pas spécifiquement intéressés par les solutions qui impliquent (IsOneWay = true), à moins qu'il devient clair que je suis très confus au sujet de sa signification et ses conséquences.

Merci!

Répondre

3

Vérifiez this article sur CodeProject. Ceci décrit un exemple basique de rappels. Peu de choses que vous pourriez avoir à changer:

  • Le contrat de rappel, les opérations marquées comme un moyen - est d'éviter le blocage du serveur en raison du mauvais client (une pratique recommandée). Mais si vous devez bloquer le serveur, vous devez le supprimer d'une manière. Notez que si vous rappelez plusieurs clients un par un, vous devrez peut-être rappeler chacun d'entre eux sur un autre thread, sinon le premier client bloquera le rappel du client suivant.

  • Quand invoquer le rappel est vraiment une implémentation du serveur. L'exemple donné gère une liste de canaux de rappel client lorsque le client se joint (ou s'abonne à vos besoins). Maintenant, cette liste peut être utilisée pour invoquer le rappel de la manière que vous voulez. Vous pouvez donc appeler des rappels sur la minuterie en faisant simplement un itération sur la liste. Notez que vous devez garantir un accès sécurisé à la liste.

  • Si le client doit retourner un résultat à nouveau rappel alors OneWay ne peut pas être utilisé. Comme mentionné précédemment, abonner signifie simplement ajouter à la liste (rejoindre la partie dans l'exemple) et se désinscrire signifie supprimer de la liste (laisser parti).

Modifier:

J'ai pris le code source de la example prévoyante et modifié comme suit:

Ajout d'une méthode Echo dans le contrat de rappel:

public interface IBeerInventoryCallback 
{ 
    ... 

    [OperationContract] 
    string Echo(string message); 
} 

Echo invoqué du service lorsque quelqu'un a quitté la partie et imprimé la réponse du client sur la console. Et cela a fonctionné sans problèmes.

Notez que cet exemple utilise un proxy client généré par VS qui hérite de System.ServiceModel.DuplexClientBase<T>, ce qui rend le code client beaucoup plus simple. Peut-être, vous devriez l'essayer.

+0

Plus facile à décrire IsOneWay = faux que terminé. –

+0

Quel est le problème de ne pas spécifier l'attribut IsOneWay sur le contrat de rappel? – VinayC

+0

Cela ne fonctionne pas, pour autant que j'ai essayé. [Voir mon exemple ici] (http://stackoverflow.com/questions/3392123/wcf-duplex-callback-sample-failing). Est-ce que ça marche pour toi? –