Comment guérir reproché WCF canaux?
Quand un seul ClientBase<T>
exemple, est utilisé pour de multiples WCF service d'appels, il peut obtenir un canal dans un reproché à l'etat (c'est à dire. lorsque le service est en panne).
Je voudrais guérir le canal automatiquement lorsque le service se lève de nouveau. La seule façon que j'ai trouvée est d'appeler le code suivant avant chaque appel de méthode:
if (clientBase.InnerChannel.State == CommunicationState.Faulted)
{
clientBase.Abort();
((IDisposable)clientBase).Dispose();
clientBase = new SampleServiceClientBase();
}
J'ai eu le sentiment que ce n'est pas la bonne façon de le faire. Quelqu'un a une meilleure idée?
OriginalL'auteur Jader Dias | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas. Une fois qu'un canal est reproché, c'est blâmé pour de bon. Vous devez créer un nouveau canal. WCF canaux sont stateful (dans une façon de parler), donc un reproché canal moyens de l'état est peut-être endommagé.
Ce que vous pouvez faire est de mettre de la logique que vous utilisez une méthode utilitaire:
Alors vous pouvez appeler votre service avec les éléments suivants:
Ou si vous souhaitez utiliser la valeur par défaut constructeur sans paramètre, juste:
Puisqu'il gère également le cas où le service est
null
, vous n'avez pas besoin d'initialiser le service avant de l'appeler.À peu près le mieux que je peux offrir. Peut-être que quelqu'un d'autre a une meilleure façon.
Pas si elle met en œuvre
ICommunicationObject
. LeDispose
mise en œuvre sur WCF canaux est en fait une partie du problème.Le
Dispose
méthode ne devrait pas avoir été dans mon exemple, je l'ai enlevé. L'appel deDispose
sur les objets de communication est bien documenté, à tort, comme il l'appelle simplementClose
en interne lorsque vous voulez l'appelerAbort
sur une faute (comme ci-dessus). Sauf si vous êtes à la mise en œuvre de vos propres objets de communication, vous n'avez pas besoin de vous soucier deIDisposable
ici. Il y a un exemple plus détaillé dans un intercepteur de mise en œuvre que j'ai écritje vous remercie. En fait co = null, déclenche une exception et suggère de remplacer null par défaut(co). Je n'ai décommenter la ligne.
Vous devrez peut-être ajouter le
class
contrainte à la définition générique dans ce cas. Pas besoin de changer le code, car il n'y a pas les structures qui mettent en œuvre desICommunicationObject
.OriginalL'auteur Aaronaught
C'est ce que je fais actuellement, mais je ne peux pas dire que c'est la meilleure option.
Je recrée le proxy lorsqu'une exception se produit lors de l'appel.
SystemException
, surtout si vous n'êtes pas re-lancement. Cet arbre comprend les instances deOutOfMemoryException
etStackOverflowException
. Aussi, vous n'êtes pas en disposer correctement de l'ancien canal ici.Compris. C'était juste un exemple rapide. Voyez-vous un gros problème à laisser le canal d'obtenir recueillies au lieu d'explicitement l'élimination? Je suppose que nous n'allons pas pour recommencer cette opération 1000 fois avant de nous abandonner.
Je l'ai essayé et il a causé plus de problèmes
P: Le
ClientBase<TChannel>
classe ne semble pas avoir un finaliseur sur ce qui s'appelleClose
ouAbort
, donc je dirais que, oui, c'est un problème si vous n'appelez jamaisDispose
(ouClose
ouAbort
); c'est probablement une fuite des ressources réseau.Cool. Qui fait sens.
OriginalL'auteur Scott P