unbehandelte Ausnahme machen WCF-Dienst zum Absturz bringt?
Möchte ich wissen, ob nicht behandelte Ausnahme machen WCF-Dienst Abstürzen. Ich habe geschrieben das folgende Programm zeigt die unbehandelte Ausnahme in einem thread gestartet, der von der WCF-service wird die gesamte WCF-Dienst Abstürzen.
Meine Frage ist, ich möchte, um zu bestätigen, ob unbehandelte Ausnahme in threads (angefangen von der WCF-service) machen WCF-crash? Meine Verwirrung ist denke ich, WCF sollte stabil sein Dienst sollte nicht Abstürzen, weil der nicht behandelte Ausnahme.
Ich bin mit VSTS 2008 + C# + .Net 3.5 zu entwickeln, die eine selbst-gehostete Windows-Service-basierte WCF-Dienst.
Hier sind die zugehörigen Teile des Codes,
namespace Foo
{
//NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
[ServiceContract]
public interface IFoo
{
[OperationContract]
string Submit(string request);
}
}
namespace Foo
{
//NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
public class FooImpl : IFoo
{
public string Submit(string request)
{
return String.Empty;
}
}
}
namespace Foo
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
ServiceHost host = new ServiceHost(typeof(FooImpl));
protected override void OnStart(string[] args)
{
host.Open();
//start a thread which will throw unhandled exception
Thread t = new Thread(Workerjob);
t.Start();
}
protected override void OnStop()
{
host.Close();
}
public static void Workerjob()
{
Thread.Sleep(5000);
throw new Exception("unhandled");
}
}
}
- Ihr Beispiel zeigt nicht "unbehandelte Ausnahme in einem thread gestartet, der von der WCF-Dienst", aber "unbehandelte Ausnahme in einem thread gestartet Windows-Dienst". Es hat nichts zu tun mit WCF.
- Ich beginne WCF-self-host in Windows-Dienst hosten.Open()), die ich meine unbehandelte Ausnahme in der WCF-service. Sorry für die verwirrende Bezeichnung, und keine Kommentare oder Antworten auf meine Frage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist eine unbehandelte Ausnahme in einem thread werden den Prozess verlangsamen.
Dieser Prozess Absturz:
Dieser wird nicht:
Eine nicht behandelte Ausnahme auf der service-Seite wird die Ursache der Kanal (die Verbindung zwischen dem client und dem server), um den "Fehler" z.B. abgerissen werden.
Ab diesem Zeitpunkt kann man nicht nennen, die vom client über den gleichen proxy-client-Objekt-Instanz mehr - müssen Sie neu-erstellen der proxy-client.
Ihre beste Wette ist, um alle Fehler auf der server-Seite, wenn möglich. Überprüfen Sie heraus die IErrorHandler - Schnittstelle, die Sie implementieren sollten, auf Ihre service-Implementierung Klasse, um alle nicht behandelten .NET-exceptions in SOAP-Fehler (die NICHT Ursache der Kanal-Fehler) oder Bericht /schlucken Sie Sie ganz.
Marc
Ist das Standardverhalten der WCF-runtime ist es, alles zu schlucken, doch ein paar Typen von Ausnahmen. Also, wenn Ihr code eine Ausnahme ausgelöst wird unten im Stapel an die WCF-Laufzeitumgebung (wie wenn Sie werfen, die von einem WCF-Betrieb), wird es NICHT zum Absturz der app (es sei denn, es ist als "fatal" Ausnahme, wie OOM, SEHException, etc.). Wenn die Ausnahme nicht Teil der operation Schuld, der Vertrag, dann der Kanal wird bemängelt, sonst nicht.
Wenn die WCF-Laufzeit ist nicht unter den code auf dem stack, dann wird die Ausnahme /wird/den Prozess zum Absturz.
Dies ist ähnlich wie die ASP.NET runtime.
Wenn Sie möchten, um Bildschirm für Ausnahmen Fliegen aus der WCF-Operationen in einer Allgemeinen Weise, ich empfehle das IOperationInvoker-Schnittstelle. Sie können auch IErrorHandler, aber Ihre IErrorHandler Umsetzung wird mitgeteilt, Ausnahmen andere, als diejenigen, geworfen von der "user-code" (WCF-Operationen), wie SocketAbortedExceptions auf WCF-internen I/O-threads, die sind wahrscheinlich nicht interessant für Sie.
Wenn Sie nicht behandeln, eine Ausnahme, die es übergeben bekommt, auf der das Betriebssystem und die Antworten durch das töten von was auch immer Anwendung, die die Ausnahme verursacht hat.
Warum nicht fügen Sie einfach eine try/catch -, die Ausnahmen zu behandeln, so dass Sie Ihren Dienst nicht getötet ?
Wenn Sie nicht über eine ordnungsgemäße Fehlerbehandlung es wird das Programm Abstürzen. Seine gute Praxis zu legen,
block in Ihren code, um sicherzustellen, dass, wenn es nicht eine Ausnahme ist, es zu handhaben sind anmutig. Beispiele http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx
Können Sie Gebrauch machen von
FaultException
zu kommunizieren, Fehler auf der client-Seite und halten Sie die Logik in den Dienst.Überprüfen Sie diese Beispiel, hoffe es hilft dir.