WCF de Serveur à Client de la méthode de rappel avec la valeur de retour
J'ai tenté la question de différentes façons, consultez mon profil pour les deux autres questions en expliquant la difficulté que j'ai eu avec les approches que j'ai pris à ce scénario. Je vais passer ici.
J'ai juste besoin d'un exemple (C# de préférence) d'un serveur de retour d'appel vers un client (plus d'un nettcp canal), le client calcule une réponse, et renvoie un résultat.
- Le serveur du thread appelant est bloqué jusqu'à ce que le client envoie la réponse.
- Rappel du serveur est invité par un événement, comme une minuterie, pas un appel par le client.
- Le client n'a pas besoin d'appel vers le serveur dans le contexte de rappel du serveur, il n'y a pas de blocage de défis.
- Le client peut prendre (et pour cet exercice, devrait prendre) un ou plusieurs paramètres avec lequel effectuer le calcul
- Le client peut retourner (et pour cet exercice, doit retourner) un non-nulle résultat
- L'approche utilisée doit au moins être compatible, si ce n'est mis en œuvre, avec la capacité à gérer plusieurs clients à leur tour, y compris un abonnement() et de désabonnement() fonctionnalité.
- Ce n'est pas de devoirs, c'est de servir comme un exemple de la façon de construire une basée sur WCF abonné/l'éditeur serveur qui prend en charge (peu) confiance des clients à faible latence de communication serveur-client sans interrogation et sans jeter les messages (par-dessus la clôture)
- Je suis PAS spécifiquement intéressés par les solutions qui impliquent
(IsOneWay = true)
, sauf lorsqu'il devient clair que je suis très confus au sujet de sa signification et de ses conséquences.
Merci!
OriginalL'auteur Jason Kleban | 2010-09-14
Vous devez vous connecter pour publier un commentaire.
Vérifier cet article sur CodeProject. Ceci décrit un exemple de base de rappels. Quelques choses que vous pourriez avoir à changer:
Sur le contrat de rappel, les opérations marquées que dans un sens - c'est pour éviter le blocage du serveur en raison du mauvais client (recommandé). Mais si vous devez bloquer le serveur, vous devez l'enlever d'une seule manière. Notez que si vous allez au rappel de plusieurs clients, un par un, alors vous pourriez avoir à rappel de chacun sur les différents threads d'autres sages premier client bloc de rappel à côté client.
Lors de l'appeler de rappel est vraiment un serveur de mise en œuvre. L'exemple donné maintient une liste de rappel de client canaux à chaque fois qu'client rejoint (ou s'abonne à votre exigence). Maintenant, cette liste peut être utilisée pour appeler de rappel de la façon que vous voulez. Donc, vous pouvez appeler la fonction de rappel sur la minuterie par simple itération sur la liste. Notez que vous devez vous assurer thread-safe d'accès à la liste.
Si le client doit retourner un résultat dans le rappel, puis de nouveau un sens univoque ne peut pas être utilisé.
Comme mentionné précédemment, abonnez-vous, consiste simplement à ajouter à la liste (joindre le parti dans l'exemple) et de se désinscrire signifie la suppression de la liste (congé partie).
Modifier:
J'ai pris le code source de la exemple voyants et modifié comme suit:
Ajouté une méthode
Echo
en contrat de rappel:Invoqué l'Écho de service lorsque quelqu'un a laissé la partie et imprimées réponse de client sur la console. Et cela a fonctionné sans aucun problème.
Notez que cet exemple utilise VS généré client proxy qui hérite de
System.ServiceModel.DuplexClientBase<T>
ce qui rend le code client beaucoup plus simple. Peut-être, vous devriez l'essayer.Quel est le problème en ne spécifiant pas IsOneWay attribut sur le contrat de rappel?
Il ne fonctionne pas, autant que je l'ai essayé. Voir mon exemple ici. Faut-il travailler pour vous?
Désolé pour la réponse tardive - StackOverflow semble être un peu lent avec les notifications de message...
Je ne suis pas certain si votre code fonctionne ou pas. Cependant, j'ai juste modifié l'exemple (que j'ai vue) de code source pour ajouter de synchronisation de rappel et le travail w/o tous les problèmes. J'ai édité ma réponse pour ajouter mes modifications.
OriginalL'auteur VinayC