Nicht behandelte Ausnahme wird den WCF-Dienst zum Absturz bringen?

7

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%     
George2 16.07.2009, 07:53
quelle

6 Antworten

11

Ja, eine nicht behandelte Ausnahme in einem Thread wird den Prozess verlangsamen.

Dieser Prozess wird abstürzen:

%Vor%

Dieser wird nicht:

%Vor%     
Fredrik Mörk 16.07.2009, 08:04
quelle
17

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

    
marc_s 16.07.2009 08:14
quelle
7

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>     

Dan T 28.12.2009 19:04
quelle
3

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?

    
jussij 16.07.2009 08:04
quelle
1

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 Ссылка

    
AutomatedTester 16.07.2009 08:09
quelle
1

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.

    
Juan Pablo 1982 28.08.2012 18:42
quelle