Die beste Methode zum Behandeln eines WCF-Timeouts

8

Ich habe eine Echtzeit-App, die Assets rund um eine Reihe von Websites im ganzen Land verfolgt. Als Teil dieser Lösung habe ich 8 Client-Apps, die einen zentralen Server aktualisieren.

Meine Frage ist, dass die Apps manchmal die Verbindung zum zentralen Server verlieren und ich mich frage, was ist der beste Weg, damit umzugehen? Ich weiß, ich könnte nur die maximalen Sende- / Empfangszeiten erhöhen, um mit dem Timeout fertigzuwerden. ABER ich möchte auch eine elegante Lösung, wenn die Verbindung zum Server unterbrochen ist:

Zum Beispiel rufe ich meine Dienste so auf:

%Vor%

Ich dachte daran, einen Versuch zu machen, also ...

%Vor%

Wenn ich es so behandle, kann ich den Code nicht wiederholen, ohne eine Menge Code-Wiederholung zu haben. Hat jemand irgendwelche Vorschläge?

EDIT: Sixto Saez und user24601 Antworten mit einer Gesamtlösung zu suchen, ist besser als Zeitüberschreitungen auf einer einzelnen Ausnahmeebene ABER ... Ich dachte, dass das unten mein Problem lösen würde (aber es würde ein TON hinzufügen der zusätzlichen Codefehlerbehandlung):

%Vor%     
Jon Jones 29.06.2011, 13:12
quelle

4 Antworten

3

Für den Anfang denke ich, dass Ihre Wcf-Fehlerbehandlung falsch ist. Es sollte so aussehen

%Vor%

Ich würde auch den Fehler erneut werfen, um den Benutzer über das Problem zu informieren.

    
null_pointer 29.06.2011 13:20
quelle
2

Ich habe einen zweigleisigen Ansatz, um zu überprüfen, ob der Server aktiv ist:

1) Ich habe alle 5 Sekunden einen 'PING' für den Server eingerichtet. Der Server antwortet mit einem 'PONG' und einer Lastbewertung (niedrig, mittel, hoch, damit der Client seine Last auf dem Server anpassen kann). Wenn der Client EVER kein Pong erhält, nimmt er an, dass der Server ausgefallen ist (da dies eine sehr geringe Belastung für den Server darstellt - horchen und antworten).

2) Zufällige Zeitüberschreitungen wie die, die Sie abfangen, werden zusammen mit allen erfolgreichen Verbindungen in einer ConnectionMonitor-Klasse protokolliert. Ein einziges dieser Zeitlimitüberschreitungen reicht nicht aus, um den Server außer Betrieb zu nehmen, da einige sehr prozessorlastig sind oder nur sehr lange dauern können. Ein zu hoher Prozentsatz dieser Werte führt jedoch dazu, dass die Anwendung das Zeitlimit für den Server einhält.

Ich wollte auch nicht für jeden einzelnen Verbindungs-Timeout eine Nachricht ausgeben, weil sie zu häufig bei Leuten vorkommt, die schlechtere Server benutzen (oder nur ein Computer, der in ihrem Labor als Server liegt). Die meisten meiner Anrufe können einmal oder zweimal verpasst werden, aber fehlende 5 oder 6 Anrufe verursachen eindeutig eine Intrusion.

Wenn ein Server-Timeout-Status eintritt, erstelle ich ein kleines Dialogfeld, das erklärt, was mit dem Benutzer passiert.

    
DanTheMan 29.06.2011 13:33
quelle
1

Vor dem Entwerfen Ihrer Ausnahmebehandlung ist eine wichtige Entscheidung zu treffen, ob Sie eine garantierte Zustellung jeder Nachricht wünschen, die der Client sendet, oder ob es in Ordnung ist, dass der Dienst einige "verliert". Für garantierte Zustellung ist die beste integrierte Lösung die netMsmqBinding, vorausgesetzt, der Client kann konfiguriert werden unterstütze es. Ansonsten gibt es eine einfache zuverlässige Messaging-Funktion , die in WCF integriert ist. Wenn Sie versuchen, die Nachrichtenzustellung rein durch Ausnahmebehandlung zu behandeln, werden Sie ein Kaninchenloch durchgehen ...:)

    
Sixto Saez 29.06.2011 13:30
quelle
1

Hallo Bitte sehen Sie meine Lösung unten. Bitte beachten Sie auch, dass der unten stehende Code nicht kompiliert wurde und daher einige Logik- und Tippfehler aufweisen kann.

%Vor%     
Jethro 29.06.2011 18:59
quelle

Tags und Links