2010-03-20 5 views
1

Dans mon programme client, il existe une connexion WCF qui est ouverte au démarrage et qui reste soi-disant connectée jusqu'à l'arrêt. Cependant, il y a une chance que le serveur se ferme en raison de circonstances imprévisibles (imaginez quelqu'un qui tire le câble).Comment gérer correctement une connexion WCF défaillante?

Étant donné que le client utilise beaucoup de méthodes de contrat dans beaucoup d'endroits, je ne veux pas ajouter try/catch à chaque appel de méthode.

J'ai 2 idées pour traiter cette question:

  1. Créer une méthode qui prend un délégué et exécute le délégué dans un try/catch et retourne une exception en cas d'exception connue, ou null autrement. L'appelant doit faire face à des résultats null-null.

  2. Écoutez l'événement Faulted de l'objet CommunicationObject sous-jacent. Mais je ne vois pas comment je pourrais gérer l'événement, sauf pour afficher un message d'erreur et de fermer.

Y a-t-il des meilleures pratiques pour la connexion WCF faillé qui existent pour la vie de l'application?

Répondre

0

j'ai écrit un billet de blog sur les exceptions dans WCF qui traite de la façon de traiter ceci: http://jamescbender.com/bendersblog/Default.aspx

+2

votre blog sur Faulted Channels n'est plus en ligne, à ce jour. – SwissCoder

+0

C'est pourquoi les liens dans Stack Overflow sont nulles. Votre blog n'existera pas dans 10 ans, mais ce sera le cas! –

+0

Le lien n'est plus disponible. – dpurrington

1

Si vous avez les deux extrémités du fil sous votre contrôle - le serveur et le client sont des applications .NET - vous pourriez penser à cette approche à la place:

  • mettre tous vos contrats de services et de données dans un assembly partagé, que le serveur et le client utiliseront

  • créer le ChannelFactory<IYourService> au moment du démarrage et le mettre en cache; car il doit avoir accès au contrat de service, cela ne fonctionne que si vous pouvez partager le contrat de service entre le serveur et le client. Cette opération est la partie de la construction coûteuse du client WCF

    ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>(); 
    
  • créer le canal de communication réelle entre le client et le serveur à chaque fois que vous effectuez un appel, sur la base du ChannelFactory. C'est assez pas cher et ne coûte pas beaucoup de temps - et vous pouvez totalement ignorer toute pensée d'avoir à détecter ou traiter des canaux faillées .....

    IYourService client = factory.CreateChannel(); 
    client.CallYourServiceMethod(); 
    

Sinon, ce que vous devez essentiellement do encapsule tous les appels de service dans une méthode, qui vérifie d'abord l'état de défaillance d'un canal, et si le proxy client est en défaut, abandonne l'actuel et en recrée un nouveau.

+0

Je suis déjà fait les 2 premiers points de balle que vous avez suggéré, je aurais dû ajouter cette information à la question. Cependant, je n'aime pas votre troisième point: la création d'une chaîne nécessite aussi un certain nombre d'essais/catch, donc je n'ai rien gagné. – mafu

+0

Quant au dernier paragraphe, je suppose que j'aime cette idée. Je n'ai pas pensé à essayer de recréer la chaîne, bonne idée. – mafu

Questions connexes