Ich möchte wissen, ob die nicht behandelte Ausnahme den WCF-Dienst zum Absturz bringen wird. Ich habe das folgende Programm geschrieben, das zeigt, dass unbehandelte Ausnahme in einem Thread, der von WCF-Dienst gestartet wird, den gesamten WCF-Dienst abstürzt.
Meine Frage ist, ich möchte bestätigen, ob die nicht behandelte Ausnahme in Threads (vom WCF-Dienst gestartet) den WCF zum Absturz bringt. Meine Verwirrung ist, denke ich, dass WCF stabiler Dienst sein sollte, der wegen unbehandelter Ausnahme nicht abstürzen sollte.
Ich verwende VSTS 2008 + C # + .Net 3.5, um einen selbst gehosteten Windows Service-basierten WCF-Dienst zu entwickeln.
Hier sind die zugehörigen Teile des Codes,
%Vor%Ja, eine nicht behandelte Ausnahme in einem Thread wird den Prozess verlangsamen.
Dieser Prozess wird abstürzen:
%Vor%Dieser wird nicht:
%Vor%Eine nicht behandelte Ausnahme auf der Serviceseite führt dazu, dass der Kanal (die Verbindung zwischen dem Client und dem Server) "fehlerhaft" ist - z. abgerissen werden.
Ab diesem Zeitpunkt können Sie nicht mehr vom Client aus dieselbe Proxy-Client-Objektinstanz aufrufen - Sie müssen den Proxy-Client neu erstellen.
Am besten gehen Sie mit allen Fehlern auf der Serverseite um, wann immer dies möglich ist. Sehen Sie sich die IErrorHandler -Schnittstelle an, die Sie in Ihrer Service-Implementierung implementieren sollten Klasse, um alle unbehandelten .NET-Exceptions in SOAP-Fehler umzuwandeln (was NOT dazu führt, dass der Channel einen Fehler macht) oder diese vollständig zu melden / zu schlucken.
Marc
Das Standardverhalten der WCF-Laufzeit besteht darin, alle Ausnahmen bis auf wenige Typen zu verschlingen. Wenn also Ihr Code eine Exception im Stack zur WCF - Laufzeit auslöst (zB wenn Sie eine WCF - Operation auslösen), wird die App NICHT zum Absturz gebracht (es sei denn, es handelt sich um eine "fatale" Ausnahme wie OOM, SEHException usw.) .). Wenn die Ausnahme nicht Teil des Fehlervertrags der Operation ist, wird der Kanal fehlerhaft, andernfalls nicht.
Wenn die WCF-Laufzeit nicht unter Ihrem Code auf dem Stapel liegt, wird die Ausnahme den Prozess abbrechen / abstürzen.
Dies ist ähnlich der Laufzeit von ASP.NET.
Wenn Sie nach Ausnahmen suchen möchten, die aus den WCF-Vorgängen herauskommen, empfehle ich die IOperationInvoker-Schnittstelle. Sie können auch IErrorHandler verwenden, aber Ihre IErrorHandler-Implementierung wird über Ausnahmen benachrichtigt, die nicht von "user code" (WCF-Operationen) stammen, wie SocketAbortedExceptions in internen WCF-I / O-Threads, die Sie wahrscheinlich nicht interessieren. p>
Wenn Sie eine Ausnahme nicht behandeln, wird sie an das Betriebssystem weitergegeben und reagiert, indem sie die Anwendung außer Kraft setzt, die die Ausnahme verursacht hat.
Warum fügen Sie nicht einfach einen try / catch hinzu, um die Ausnahmen zu behandeln, damit Ihr Dienst nicht beendet wird?
Wenn Sie keine richtige Fehlerbehandlung haben, wird das Programm abstürzen. Es ist gute Praxis, ein
zu setzen %Vor%Blockieren Sie in Ihrem Code, um sicherzustellen, dass, wenn es eine Ausnahme auslöst, es ordnungsgemäß behandelt wird. Beispiele finden Sie unter Ссылка
Sie können FaultException
verwenden, um Fehler an die Clientseite zu kommunizieren und die Logik im Service zu behalten.
Sehen Sie sich dieses Beispiel an, hoffentlich hilft es Ihnen.
Tags und Links wcf .net c# windows-services visual-studio-2008