In meiner WCF-Client-Klasse handle ich das Faulted()
-Ereignis, so dass, wenn der Remote-Dienst eine Ausnahme auslöst und den Kanal beschädigt, ich es immer noch anmutig herunterfahren kann. Hier ist mein Code:Was ist System.ServiceModel.Diagnostics.CallbackException und warum kann ich damit nicht umgehen?
protected void RemoteDataRetriever_Faulted(object sender, EventArgs e)
{
(sender as ICommunicationObject).Abort();
this.Dispose();
throw new ChannelTerminatedException("The remote service threw an unhandled exception and as a result the channel has been closed.");
}
So was würde ich erwarten, ist, dass der Client die ChannelTerminatedException
umgehen kann, die ich geworfen habe manuell und eine Nachricht an den Benutzer senden, usw. Statt meine Ausnahme in einem System.ServiceModel.Diagnostics.CallbackException
gewickelt zu werden. Ok, gut. Außer hier ist der Haken: diese CallbackException existiert nicht in der ServiceModel-Bibliothek und es scheint, dass ich keine Möglichkeit habe, sie zu behandeln, außer als generisches Exception
, was mir für meine Komponententests nicht gut tut. Was zum Teufel geht hier vor? Kann ich das irgendwie deaktivieren und die Ausnahme werfen, die ich ursprünglich wollte?
Da Sie die Ausnahme selbst auslösen, können Sie eine andere Ausnahme verwenden, die nicht umgebrochen wird? Ich denke etwas, das nicht die Tatsache entlarvt, dass Sie WCF unter alles verwenden ... –
Kein Würfel. Ich habe die ChannelTerminatedException in eine StackOverflowException geändert ;-) und es wird immer noch in diese nervige CallbackException eingepackt (die eine, die ich werfe, ist die innere Ausnahme). Und dann gibt es die lästige Nachricht: "Ein Benutzer-Rückruf hat eine Ausnahme ausgelöst. Überprüfen Sie den Ausnahme-Stack und die innere Ausnahme, um den Rückruf zu bestimmen, der fehlgeschlagen ist." Ja, ich weiß, dass der Rückruf eine Ausnahme ausgelöst hat! Ich war derjenige, der es geworfen hat! Ich werde weitere Nachforschungen anstellen und prüfen, ob irgendwo ein WCF-Flag/Parameter vorhanden ist, mit dem ich dieses Verhalten deaktivieren kann. –