Wie bekomme ich genaue Exception-Stapel in WCF Task-based Operation

8

Ich verwende die WCF IErrorHandler-Schnittstelle, um Fehler auf der Serverseite eines WCF-Diensts zu erfassen und zu protokollieren. Das StackTrace der Ausnahme, die an HandleError und ProvideFault übergeben wird, ist jedoch durcheinander:

  

um   System.ServiceModel.Dispatcher.TaskMethodInvoker.InvokeEnd (Objekt   Instanz, Objekt [] & amp; Ausgaben, IAsyncResult Ergebnis) um   System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeEnd (MessageRpc & amp;   rpc) bei   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage7 (MessageRpc & amp;   rpc)       .... viel mehr

Ich bin nicht überrascht, zufällige Dispatcher-Methoden im Stack-Trace zu sehen, aber ich nahm an, dass ich meine eigene Methode oben auf dem Stack sehen würde.

Ich habe festgestellt, dass dies nur bei Operationen geschieht, die aussehen wie

%Vor%

Dienste, die so aussehen, haben einen richtigen Stack-Trace, den ich protokollieren kann:

%Vor%

Als eine FYI, hier ist, was die Fehlerhandler-Methoden sind:

%Vor%

Beachten Sie, dass der Ausnahmetyp und die Nachricht korrekt sind. Es ist also so, als würden sie meine Ausnahme fälschlicherweise mit einem "ex-Wurf" statt mit "throw" erneut auslösen;

Gibt es eine Möglichkeit, die richtige Stack-Ablaufverfolgung der Ausnahme von einer der IErrorHandler-Methoden zu erhalten?

    
Clyde 05.11.2014, 16:19
quelle

1 Antwort

13

Ich habe es gelöst, indem ich den folgenden benutzerspezifischen Aufrufer verwendete. Mein einziges Ziel war es, die Fehler mit dem richtigen Stack-Trace zu protokollieren, so dass der Fehler, der letztendlich ausgelöst wird, den schlechten Stack-Trace behält.

%Vor%

Es kann mit einem Attribut in Ihrer Serviceklasse oder -methode verknüpft werden:

%Vor%

Früher habe ich die Fehler in einer Implementierung der IErrorHandler -Schnittstelle protokolliert, aber zu diesem Zeitpunkt war der Stack-Trace bereits durcheinander. Ich habe versucht, den Aufrufer der Operation zu modifizieren, um eine Ausnahme mit dem richtigen Stack-Trace zu erzeugen, aber ich habe nie richtig funktioniert. Aus irgendeinem Grund wurden meine benutzerdefinierten Fehlerausnahmen in generische Fehlerausnahmen umgewandelt, weshalb ich diesen Ansatz aufgegeben habe.

    
Morten Christiansen 22.01.2015 14:47
quelle

Tags und Links