Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Beispiel "ExpectedExceptions" veranschaulicht, wie erwartete Ausnahmen erfasst werden, wenn ein typierter Client verwendet wird. Dieses Beispiel basiert auf dem Abschnitt Erste Schritte, der einen Rechnerdienst implementiert. In diesem Beispiel ist der Client eine Konsolenanwendung (.exe) und der Dienst wird von Internetinformationsdienste (IIS) gehostet.
Hinweis
Die Einrichtungsverfahren und Build-Anweisungen für dieses Beispiel befinden sich am Ende dieses Themas.
In diesem Beispiel wird veranschaulicht, wie das Abfangen und Behandeln der beiden erwarteten Ausnahmetypen erfolgt, die korrekte Programme behandeln müssen: TimeoutException
und CommunicationException
.
Ausnahmen, die aus Kommunikationsmethoden in einem WCF-Client (Windows Communication Foundation) ausgelöst werden, sind entweder erwartet oder unerwartet. Unerwartete Ausnahmen umfassen katastrophale Fehler wie OutOfMemoryException
und Programmierfehler wie ArgumentNullException
oder InvalidOperationException
. In der Regel gibt es keine nützliche Möglichkeit, unerwartete Fehler zu behandeln. Normalerweise sollten Sie sie beim Aufrufen einer WCF-Clientkommunikationsmethode nicht abfangen.
Erwartete Ausnahmen von Kommunikationsmethoden auf einem WCF-Client umfassen TimeoutException
, CommunicationException
und alle abgeleiteten Klassen von CommunicationException
. Diese weisen auf ein Problem während der Kommunikation hin, das sicher behandelt werden kann, indem der WCF-Client abgebrochen und ein Kommunikationsfehler gemeldet wird. Da externe Faktoren diese Fehler in jeder Anwendung verursachen können, müssen korrekte Anwendungen diese Ausnahmen abfangen und beim Auftreten wiederherstellen.
Mehrere vom CommunicationException
abgeleitete Klassen können von einem Client geworfen werden. In manchen Fällen fangen Anwendungen auch einige von ihnen ab, um eine bestimmte Verarbeitung auszuführen, während sie andere Ausnahmen als CommunicationException
behandeln lassen. Dies kann durchgeführt werden, indem zuerst Ausnahmen bestimmter Typen und dann CommunicationException
in einer späteren Abfangklausel abgefangen werden.
Code, der eine Clientkommunikationsmethode aufruft, muss TimeoutException
und CommunicationException
abfangen. Eine Möglichkeit zur Behandlung solcher Fehler besteht darin, den Client abzubrechen und den Kommunikationsfehler zu melden.
try
{
...
double result = client.Add(value1, value2);
...
client.Close();
}
catch (TimeoutException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
catch (CommunicationException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
Wenn eine erwartete Ausnahme auftritt, kann der Client danach möglicherweise nicht mehr verwendbar sein. Um festzustellen, ob der Client weiterhin verwendet werden kann, überprüfen Sie, ob die State
Eigenschaft lautet CommunicationState
. Geöffnet. Wenn sie noch geöffnet ist, ist sie weiterhin verwendbar. Andernfalls sollten Sie den Client beenden und alle Verweise darauf freigeben.
Vorsicht
Möglicherweise stellen Sie fest, dass Clients, die eine Sitzung haben, nach einer Ausnahme häufig nicht mehr verwendet werden können, und Clients, die keine Sitzung haben, häufig nach einer Ausnahme weiterhin verwendet werden können. Allerdings ist keine dieser Elemente garantiert. Wenn Sie also versuchen möchten, den Client nach einer Ausnahme weiter zu verwenden, sollte die Anwendung die State
Eigenschaft überprüfen, um zu überprüfen, ob der Client noch geöffnet ist.
Wenn Sie das Beispiel ausführen, werden die Vorgangsantworten und -ausnahmen im Clientkonsolenfenster angezeigt.
Der Clientprozess führt zwei Szenarien aus, von denen jeder versucht, aufzurufen Add
, gefolgt von Divide
. Im ersten Szenario wird ein Netzwerkproblem simuliert, indem der Client unterbrochen wird, bevor der Anruf bei Divide
erfolgt. Das zweite Szenario verursacht einen Timeout-Zustand, indem ein so kurzes Timeout festgelegt wird, dass die Methode nicht abgeschlossen werden kann. Die erwartete Ausgabe vom Clientprozess lautet wie folgt:
Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException
So können Sie das Beispiel einrichten, erstellen und ausführen
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.