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?
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.