WCF clientseitige Fehlerbehandlung

8

Ich verwende einen klobigen WCF-Server, der gelegentlich verschiedene Ausnahmen auslöst und zusätzlich einige seiner Fehler als string zurückgibt. Ich habe überhaupt keinen Zugriff auf den Servercode.

Ich möchte die interne Aufrufmethode der WCF-Client-Anforderung überschreiben und alle vom Server zurückgegebenen inneren Ausnahmen und fest codierten Fehler behandeln und das Ereignis Fault auslösen, wenn ein Fehler auftritt, pseudo:

%Vor%

Also, wenn ich myClient.GetHelloWorld() aufruft, geht es durch meine überschriebene Methode.

Wie kann das erreicht werden?
Ich weiß, dass ich den generierten Client nicht verwenden muss, aber ich möchte nicht alle Verträge erneut implementieren, und ich möchte die generierte ClientBase -Unterklasse oder zumindest ihren Kanal verwenden.
Was ich brauche, ist die Kontrolle über die interne Anfrage Call-Methode.

Aktualisieren

Ich lese diese Antwort und sieht aus, als ob ich teilweise nach dem gesucht habe, aber ich frage mich, ob es da ist ist eine Möglichkeit, ein IErrorHandler nur an den Consumer (Client) -Code anzuhängen, ich möchte es irgendwie zur ClientBase<TChannel> -Instanz hinzufügen.

Aktualisieren

Dieser Artikel sieht auch so aus sehr vielversprechend, aber es funktioniert nicht. Das angewendete Attribut scheint nicht zu wirken. Ich kann keine Möglichkeit finden, IServiceBehavior zur Clientseite hinzuzufügen.

Aktualisieren

Ich habe versucht, eine IErrorHandler via IEndpointBehavior.ApplyClientBehavior calling:

anzuhängen %Vor%

( clientRuntime ist ein Parameter), aber Ausnahmen werden immer noch direkt übersprungen MyErrorHandler .
ApplyDispatchBehavior wird überhaupt nicht aufgerufen.

Fazit

Ich muss zwei Aspekte erreichen:

  1. Wickeln Sie alle Ausnahmen ein, die während der Lebensdauer eines BaseClient<TChannel> auftreten können, und entscheiden Sie, ob Sie sie behandeln oder anwerfen möchten. Dies sollte sich um den gesamten Betrieb kümmern (der Dienst, den ich konsumiere, entlarvt ein paar Dutzend)
  2. Analysiert alle Serverantworten und löst Ausnahmen für einige von ihnen aus, so dass sie wie in Anweisung 1 weitergeleitet werden.
Shimmy 16.11.2015, 11:48
quelle

3 Antworten

1

Ich habe am Ende etwas verwendet, das auf den Antworten in dieser Frage basiert.

Es hält sich am generierten Client-Code und erlaubt den generischen Aufruf der Operationen.

Der -Code ist unvollständig, Sie können ihn also abzweigen und bearbeiten. Bitte benachrichtige mich, wenn du irgendwelche Fehler gefunden hast oder irgendwelche Aktualisierungen vorgenommen hast.

Es ist ziemlich sperrig, also teile ich einfach den Verwendungscode:

%Vor%     
Shimmy 27.11.2015, 04:54
quelle
5

Sie könnten den Ausnahmebehandlung-WCF-Proxygenerator verwenden und ändern, genauer gesagt, die Basisklasse, die er verwendet. Es ist Grundidee (überprüfen Sie diese Beschreibung zu) ist Verbindungsfestigkeit, indem Verbindungsfehler zu fangen , und wiederholen Sie die fehlgeschlagene Operation. Wie Sie sich vorstellen können, muss es zu diesem Zweck in der Lage sein, ausgelöste Ausnahmen zu erfassen, und es kann auch das Ergebnis von Aufrufen überprüfen.

Die Hauptfunktionalität wird durch die Basisklasse ExceptionHandlingProxyBase<T> angegeben, die Sie anstelle von ClientBase<T> verwenden. Diese Basisklasse hat wie folgt eine Invoke -Methode, die Sie ändern müssten.

Vereinfachte Invoke :

%Vor%

Sie müssen den throw targetEx.InnerException; -Teil ändern, um die Ausnahmen so zu behandeln, wie Sie brauchen, und natürlich sollte der Wiederherstellungswert auch für Ihre Bedürfnisse überprüft werden. Ansonsten kannst du die Wiederholungslogik verlassen oder wegwerfen, wenn du keine Verbindungsprobleme erwartest. Es gibt eine andere Variante der Methode Invoke für void return.

Oh, und übrigens, es funktioniert auch mit Duplex-Kanälen, es gibt eine andere Basisklasse für diese.

Wenn Sie den Generator nicht verwenden möchten (er funktioniert möglicherweise nicht einmal in neueren Versionen von VS), dann könnten Sie einfach die Basisklasse zum Beispiel von hier , und generieren Sie die eigentliche Implementierungsklasse mit T4 von Ihrer Service-Schnittstelle.

    
Tamas 24.11.2015 06:09
quelle
1

Wenn der Dienst keine echte Ausnahme zurückgibt, sondern nur eine Nachricht, möchten Sie möglicherweise einen ClientMessageInspector als neues Clientverhalten hinzufügen. Bitte beachten Sie: Ссылка

    
David P 17.11.2015 16:44
quelle

Tags und Links