Question

J'ai une application client qui essaie toutes les 10 secondes pour envoyer un message sur un service Web WCF. Cette application client sera sur un ordinateur à bord d'un navire, que nous connaissons aura une connectivité Internet tachetée. Je voudrais que l'application pour essayer d'envoyer des données via le service, et si elle ne peut pas, de faire la queue les messages jusqu'à ce qu'il puisse les envoyer par le service.

Afin de tester cette configuration, je commence l'application client et le service Web (à la fois sur ma machine locale), et tout fonctionne très bien. J'essaie de simuler la mauvaise connexion Internet en tuant le service et le redémarrage web il. Dès que je tue le service, je commence à me CommunicationObjectFaultedExceptions - ce qui est attendu. Mais après que je redémarrer le service, je continue à obtenir ces exceptions.

Je suis assez sûr qu'il ya quelque chose que je ne comprends pas sur le paradigme du service Web, mais je ne sais pas ce qui est. Quelqu'un peut-il donner des conseils si oui ou non cette configuration est possible, et si oui, comment résoudre ce problème (à savoir rétablir le canal de communication avec le service Web)?

Merci!

Klay

Était-ce utile?

La solution

proxys de service client ne peuvent pas être réutilisés une fois qu'ils ont faillé. Vous devez disposer de l'ancien et de recréer une nouvelle.

Vous devez également vous assurer que vous fermez le proxy de service client correctement. Il est possible pour un proxy de service WCF pour lancer une exception près, et si cela arrive, la connexion est pas fermée, de sorte que vous devez abandonner. Utilisez le "try {Fermer} / catch {} Abandonner" pattern. Gardez également à l'esprit que la méthode Éliminez les appels à proximité (et peut donc lancer une exception à la Éliminez), de sorte que vous ne pouvez pas utiliser un utilisant comme des classes normales à usage unique.

Par exemple:

try
{
    if (yourServiceProxy != null)
    {
        if (yourServiceProxy.State != CommunicationState.Faulted)
        {
            yourServiceProxy.Close();
        }
        else
        {
            yourServiceProxy.Abort();
        }
    }
}
catch (CommunicationException)
{
    // Communication exceptions are normal when
    // closing the connection.
    yourServiceProxy.Abort();
}
catch (TimeoutException)
{
    // Timeout exceptions are normal when closing
    // the connection.
    yourServiceProxy.Abort();
}
catch (Exception)
{
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards.
    yourServiceProxy.Abort();
    throw;
}
finally
{
    // This is just to stop you from trying to 
    // close it again (with the null check at the start).
    // This may not be necessary depending on
    // your architecture.
    yourServiceProxy = null;
}

Il y a un article de blog sur cette

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top