Frage

Ich habe eine Client-Anwendung, die alle 10 Sekunden versucht, eine Nachricht über einen WCF Webservice zu senden. Diese Client-Anwendung wird an Bord eines Schiffes auf einem Computer sein, die wir wissen, fleckige Internet-Anbindung haben. Ich würde für die App gerne versuchen, Daten über den Dienst zu senden, und wenn es nicht können, die Nachrichten in die Warteschlange einzureihen, bis er sie durch den Dienst senden kann.

Um diese Einstellung zu testen, beginne ich mit der Client-Anwendung und den Web-Service (sowohl auf meinem lokalen Rechner), und alles funktioniert. Ich versuche, die schlechte Internetverbindung zu simulieren, indem den Web-Service zu töten und neu zu starten. Sobald ich den Dienst zu töten, beginne ich immer CommunicationObjectFaultedExceptions - was zu erwarten ist. Aber nachdem ich den Dienst neu starten, ich weiterhin diese Ausnahmen erhalten.

Ich bin mir ziemlich sicher, dass es etwas, was ich nicht über das Web-Service-Paradigma zu verstehen, aber ich weiß nicht, was das ist. Kann jemand Beratung anbieten, ob dieses Setup möglich ist, und wenn ja, wie dieses Problem zu lösen (das heißt den Kommunikationskanal mit dem Web-Service-re-establish)?

Danke!

Klay

War es hilfreich?

Lösung

Client-Service-Proxies können nicht wiederverwendet werden, wenn sie bemängelt haben. Sie müssen von dem alten entsorgen und einen neuen erstellen.

Sie müssen auch sicherstellen, dass Sie das Client-Dienst-Proxy richtig schließen. Es ist möglich, dass ein WCF-Dienst-Proxy eine Ausnahme auf der Nähe zu werfen, und wenn dies den Anschluss geschieht nicht geschlossen ist, so dass Sie abbrechen müssen. Verwenden Sie die "try {Schließen} / catch {Abbruch}" -Muster. Auch bedenken, dass die dispose-Methode aufruft schließen (und damit eine Ausnahme von der dispose werfen kann), so dass Sie nicht nur eine Verwendung wie mit normalen Einweg-Klassen verwenden können.

Zum Beispiel:

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;
}

Es gibt einen Blog-Artikel über diese hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top