2009-08-16 7 views
1

Was ist der Deal mit CommunicationExceptions in einem System mit WCF? Ich habe einen Client, der über WCF über SOAP mit einem Server kommuniziert - alles asynchrone Kommunikation. Gelegentlich bekomme ich eine CommunicationException in mein Gesicht geworfen - ohne ein reproduzierbares Muster zu sehen, warum und wann dies geschieht.WCF - "CommunicationException wurde von Benutzercode nicht behandelt"

Jedoch; Ich kann das Programm weiterhin ausführen, da dies nur eine erste Chance (?) Ist. Deshalb nehme ich an, dass ich mir darüber keine Sorgen machen muss, und dass es hinter der Szene gehandhabt wird? Aber ich bin immer noch besorgt, und es wäre nett, wenn mich jemand darüber aufklären könnte. Sollte ich an jedem Ort, an dem ich eine Funktion über WCF anrufe, versuchen, CommunicationException zu erfassen?

+1

Sie sehen diese Ausnahme im Debugger? Dann mach dir keine Sorgen darüber - es ist eine Ausnahme der ersten Chance und wird wahrscheinlich behandelt werden. –

+0

Ja - im Debugger. Und ja - scheint eine Ausnahme der ersten Chance zu sein, da ich das Programm danach weiter ausführen kann. Damit; Keine Sorgen, dann? Sagen Sie Visual Studio, dass Sie aufhören sollten, mich wegen solcher Ausnahmen zu belästigen ..? – stiank81

Antwort

2

Die CommunicationException ist der Basistyp für alle WCF bezogene Probleme und kann auf dem Client in einer Vielzahl von Fällen erscheinen:

  • , wenn Ihr Kunde z.B fordert eine URL, die zu beschäftigt ist, nicht verfügbar
  • , wenn der Server ist und kann keine weiteren Anfragen nicht verarbeiten kann und lehnt eine Anfrage
  • , wenn etwas auf dem Netzwerk zwischen Client und Server schief geht (Verbindung abgebrochen etc.)

Wenn Sie diese Popup häufig haben, müssen Sie genauer überprüfen, ob sie wirklich CommunicationException oder ein abgeleiteter Typ sind (FaultException und viele mehr).

Ein FaultException wäre ein Hinweis, dass etwas auf dem Server schief gelaufen ist - es wird ausgelöst, wenn der Server die Anfrage bekam, aber nicht richtig damit umgehen konnte und eine Ausnahme oder einen SOAP-Fehler zurückgab.

Haben Sie notiert, was die Nachricht der Ausnahme war und ob es eine InnerException gab?

Marc

+0

Thx! Wenn ich Sie richtig verstanden habe, bedeutet dies, dass ich für CommunicationException bei jedem MyFunctionAsync() - Aufruf auf der Clientseite versuchen sollte. Aber ich nehme an, es gibt keine Notwendigkeit, dies auf der Serverseite zu tun? In meinem Fall passiert es nicht oft. Es dauert eine Weile, bis ich viele Anfragen senden kann, bis ich sie reproduzieren kann. Die Ausnahme sagt "NotFound" und die InnerException scheint zu einer WebException zu gehören.Erhalten Sie das nur als eine erste Chance Ausnahme im Debug-Modus. – stiank81

+0

Ja, auf dem Client würde ich definitiv meine Service-Anrufe in try..catch setzen. Auf der Serverseite müssen Sie in die IErrorHandler-Schnittstelle einchecken und diese in Ihrer Serviceklasse implementieren, um alle auf dem Server auftretenden Ausnahmen abzufangen und sie in SOAP-Fehler umzuwandeln, damit sie völlig "sauber" sind ;-) –

+0

Thx! Wird auf mögliche Ausnahmen auf der Server-Seite aufmerksam gemacht und konvertiert sie, wenn es welche gibt. – stiank81

0

Man könnte so etwas wie dies versuchen:

+0

Dies wurde auf der Clientseite hinzugefügt, aber die Ausnahme hat den Client nie erreicht, da es sich um eine Ausnahme der ersten Chance handelt. Aber sollte man generell solche Ausnahmen bei der Verwendung von WCF versuchen, oder kann ich davon ausgehen, dass keine Ausnahmen vom Kommunikationstyp ausgelöst werden? – stiank81

+0

Sie sollten die Ausnahme auch serverseitig abfangen und als Fehlerausnahme auslösen, wenn Sie eine Ausnahme an den Client senden müssen. Welche Fehlerausnahmen ausgelöst werden, muss im WCF-Vertrag angegeben werden. –

+0

Wirklich? Ich muss das für alles tun, falls es eine Kommunikations-Ausnahme gibt? Ich hatte gehofft WCF würde das für mich erledigen. Ich habe versucht, auf beiden Seiten Ausnahmen zu machen, aber das ändert nichts. Immer noch die Ausnahme der ersten Chance sehen - die in der EndMyServiceFunc() in der automatisch generierten Referenz.cs ist. Aber du sagst, dass es eine Chance gibt, dass es irgendwann explodieren könnte, wenn ich solche Ausnahmen nicht behandle? – stiank81

Verwandte Themen