Ce qui se passe dans WCF pour les méthodes avec IsOneWay=true à l'arrêt de l'application
J'ai une application client qu'une fois en tout, informe sur ses progrès d'un service.
L'appel de la méthode pour le service est marqué avec IsOneWay=vrai, parce que la notification n'a pas besoin de valeur de retour et je ne veux pas en retard.
Le client peut notifier les erreurs dans le service, et par la suite, il se termine.
La question est: est-ce un oneway appel de la méthode retourne à l'appelant de code après avoir envoyé le message? ou les files d'attente le message et, plus tard, il est envoyé par un autre thread?
Les deux processus (le client et le service) sont sur la même machine, et j'ai remarqué que parfois (lorsque la machine est surchargée) le service ne reçoit pas la notification d'erreur. Je soupçonne que la deuxième option que j'ai mentionné qui se passe, mais je ne suis pas sûr.
Si je suis en droit, comment puis-je m'assurer que la notification est d'envoyer et de garder la méthode unidirectionnelle?
OriginalL'auteur | 2008-12-06
Vous devez vous connecter pour publier un commentaire.
Bonne question. Avant l'application client appelle une méthode, il ouvre le canal. Le canal est utilisé pour toutes les données de communication. Il y a deux façons de l'envoi: 1) fiable de la session lors de vos paquets sont deleveried de manière fiable et fissuré les paquets sont renvoyés, 2) la commande - lorsque les demandes sur le service sont calculés dans l'ordre où ils ont été transférés à partir d'un client (pas de comment ils sont livrés). Si vous avez fiables commandé session et le service d'accueil est l'obtention de certains problèmes avec les données de votre après la fermeture de l'application, l'hôte va essayer de demander au client s'indignent de données et après aucune responce rejeter tous vous demande. Dans d'autres situations (peu fiable) après l'ouverture du canal, vous pouvez envoyer des données et de détruire la communication, oneway méthode de calcul vous demande, si il n'y aura pas d'exception.
De tester quelques possibilités avec le service de problème (pas exactement votre client paroblem est cependant utile) j'ai créer une solution:
1) projet de Bibliothèque "WcfContracts" avec un fichier "IService1.cs":
2) de la Console projet "WcfConsoleHoster" qui a référence à deux "WcfContracts", et se compose de trois fichiers:
a) Service1.cs, qui est le service de la mise en œuvre
b) Programme.cs, qui a défaut de point d'entrée et de démarrage de la service
c) le Service "App.config"
3) de la Console projet "WcfConsoleClient", qui appelle tout simplement le service
a) Dans le Programme".cs"
b) le Client "App.config"
1. Lancer une exception. Tout d'abord, nous appelons les deux sens de la méthode qui jette exception dans le serveur hôte. Alors cette exception va vers le client et le canal de l'élève sur le côté client, l'application est détruit. Bien sûr, vous pouvez gérer cela avec try()catch{} bloc.
Voyons la même chose avec une façon méthode en appelant
channel.ThrowExceptionUseIsOneWay();
. Une Exception est déclenchée dans le service d'accueil, mais il n'y a pas d'exception sur le côté client et nous obtenons "Opération". Il est important de réaliser que le canal ne sera pas disponible pour la prochaine utilisation.Donc
IsOneWay=true
fonctionne comme prévu, il envoie un message d'une seule façon. Vous ne pouvez pas retourner n'importe quel objet à partir de la méthode(void est prévu) et vous ne pouvez pas utiliser FaultContract, ou obtenir InvalidOperationException après le démarrage du service.2. Fil de discussion.Sleep(). Prochain test est sur les massifs de l'opération avec
Thread.Sleep()
.IService1
est étendue àet la réalisation de Service1.cs est attente de 5 secondes
Maintenant un peu de modification par le client pour le comptage écoulé de temps d'appel
Appel les deux sens de la méthode
ThreadSleep()
a la suite de l'Opération "exécuté en 7 secondes" (5 sec sur le fil de sommeil + 2 sec pour le canal de l'initialisation).One way method
avec l'appel dechannel.ThreadSleepUseIsOneWay()
a le résultat "0 secondes"! Il n'y a pas d'attente pour le service de réponse!Il est préférable d'utiliser NetNamedPipeBinding, qui est fiable et rapide de connexion sur la même machine.
OriginalL'auteur Artru
Découvrez ce post pour quelques renseignements détaillés:
http://kennyw.com/?p=130
Aussi, je crois que si vous avez une messagerie fiable permis que la demande serait vérifiée comme envoyé avec succès, mais comme le post ci-dessus notes, le service mettra fin à la connexion à partir de ce point.
OriginalL'auteur Kwal
Vous ne pouvez pas "assurez-vous que la notification est envoyée" ... et "garder la méthode oneway". Ca va à l'encontre de ce que "OneWay" signifie: a)
Si vous voulez vous assurer que le message est envoyé, il est ok pour faire Bidirectionnels. Vous avez très probablement ne remarquerez même pas le léger gain de performance. Et si le serveur et le client sont sur la même machine que vous avez mentionné... alors vous ne verrez pas la performance frappé à toutes les.
OriginalL'auteur Timothy Khouri
Cela pourrait être un bon endroit pour utiliser un netMsmqBinding. MSMQ tous les messages sont intrinsèquement OneWay, parce que les files d'attente sont intrinsèquement déconnecté. Une fois que le client files d'attente le message avec un netMsmq client, il peut en toute sécurité d'arrêt, et le serveur peut ensuite récupérer les messages et les traiter.
OriginalL'auteur Andy White
J'ai eu un problème similaire (une conférence à ne rien faire ou de lancer une exception). J'ai trouvé que le deserilizer responsable de la transformation de l'argument de méthode de sauvegarde xml en objets a été la création d'une exception. Ma méthode de service n'a jamais été prise en atteint et pas exception a été d'obtenir renvoyé, car il a été un appel. Je n'ai pas le détecter, jusqu'à ce que j'ai temporairement désactivé le "one-way" donc, mon exception suis retournée au client.
Espère que cela aide quelqu'un d'autre dans une situation similaire.
OriginalL'auteur John Yost
Je suis d'accord avec Timothy. Je tiens aussi à ajouter que le service WCF conserve une file d'attente pour les messages entrants. Cette file d'attente peut devenir si le service n'est pas en mesure de traiter des messages aussi vite qu'ils sont à venir dans. Lorsque la file est pleine, WCF va baisser de nouveaux messages.
Je ne suis pas sûr de ce qui se passe sur le côté client si la façon dont les messages sont supprimés. Je suppose qu'aucune exception/la faute est levée, mais je ne sais pas pour sûr.
OriginalL'auteur Karl