Ausnahmebehandlung in WCF

Ausnahmen sind Fehler, die zur Laufzeit auftreten. Ausnahmebehandlung ist die Technik zur Behandlung dieser Laufzeitfehler. Normalerweise verwenden Sie im Code Ihrer Anwendung try-, catch- und finally-Blöcke (auch als Ausnahmeblöcke bezeichnet), um Ausnahmen zu behandeln. Wenn Ausnahmen im Code der Anwendung nicht ordnungsgemäß behandelt werden und zur Laufzeit eine Ausnahme aufgetreten ist, wird die Ausführung der Anwendung beendet.

Die Ausnahmebehandlung in WCF ist nicht so einfach - Sie müssen nur .NET-Objekte über das Kabel senden, und Ihr WCF-Dienst kann nur serialisierte Daten, dh SOAP-Nachrichten, an den Client senden. Sie können Ausnahmen in WCF auf eine der folgenden drei Arten behandeln:

  1. Verwenden von FaultException
  2. Verwenden von IErrorHandler
  3. Verwenden von returnUnknownExceptionsAsFaults

In diesem Beitrag werde ich eine Diskussion über die verschiedenen Möglichkeiten präsentieren, wie Ausnahmemeldungen vom WCF-Dienst an die Verbraucher des Dienstes übertragen werden können.

Betrachten Sie diesen einfachen WCF-Dienst.

[Servicevertrag]

öffentliche Schnittstelle IDBManagerService

    {

        [OperationContract]

        void Save (Employee emp);

    }}

Der IDBManagerService-Servicevertrag enthält einen Betriebsvertrag zum Speichern eines Mitarbeiterobjekts in der Datenbank.

öffentliche Klasse DBManagerService: IDBManagerService

    {

        void Save (Mitarbeiter emp)

        {

         Versuchen

           {

            // Code zum Speichern eines Mitarbeiterobjekts in der Datenbank

           }}

           fangen (Ausnahme ex)

           {

               neue Ausnahme auslösen ("Fehler beim Speichern der Daten ...");

           }}

        }}

    }}

Angenommen, es liegt ein Fehler beim Herstellen einer Verbindung zur Datenbank oder beim Speichern des Mitarbeiterobjekts in der Datenbank vor, wenn Sie versuchen, den Dienst zu nutzen. Sie erhalten dann eine Ausnahme mit der folgenden Meldung: "System.ServiceModel.FaultException: Der Server konnte die Anforderung aufgrund eines internen Fehlers nicht verarbeiten. Weitere Informationen zum Fehler erhalten Sie entweder IncludeExceptionDetailInFaults (entweder über ServiceBehaviorAttribute oder über die Konfiguration) Verhalten) auf dem Server, um die Ausnahmeinformationen an den Client zurückzusenden, oder aktivieren Sie die Ablaufverfolgung gemäß der Microsoft .Net Framework 3.0 SDK-Dokumentation und überprüfen Sie die Server-Ablaufverfolgungsprotokolle. "

Sie können das Element includeExceptionDetailInFaults in der Datei web.config auf true setzen, damit die zusätzlichen Details der Ausnahme im Fehler enthalten sind, damit Sie leichter überprüfen können, was tatsächlich schief gelaufen ist.

Sie können dies auch erreichen, indem Sie Code schreiben. Hier ist ein Code-Snippet, das zeigt, wie Sie diese Eigenschaft auf true setzen können.

    typeof (ServiceDebugBehavior));

    new ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Sie können dies auch mithilfe des ServiceBehavior-Tags wie unten gezeigt auf true setzen.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

öffentliche Klasse DBManagerService: IDBManagerService

{

}}

Wenn Sie versuchen, den Dienst erneut zu nutzen, wird eine genauere Ausnahmemeldung angezeigt.

Verwenden von FaultException

Wenn Sie jedoch benutzerfreundliche Ausnahmemeldungen vom Dienst übergeben müssen, sollten Sie Fehlerausnahmen auslösen. Fehlerausnahmen sind Ausnahmen, die von einem WCF-Dienst ausgelöst werden, wenn zur Laufzeit eine Ausnahme auftritt. Solche Ausnahmen werden normalerweise verwendet, um nicht typisierte Fehlerdaten an die Dienstkonsumenten zu übertragen. Sie können Ausnahmen in Ihren Servicemethoden ähnlich wie bei anderen Methoden behandeln und sie dann in Fehlerausnahmen umwandeln.

Das folgende Codefragment zeigt die aktualisierte Dienstmethode - die Dienstmethode löst jetzt eine Fehlerausnahme aus.

öffentliche Klasse DBManagerService: IDBManagerService

    {

        void Save (Mitarbeiter emp)

        {

            Versuchen

            {

               // Code zum Speichern eines Mitarbeiterobjekts in der Datenbank

            }}

            fangen (Ausnahme ex)

            {

               neue FaultException auslösen ("Fehler beim Speichern der Daten ...");

            }}

        }}

    }}

Sie müssten jetzt Fehlerausnahmen in Ihrem Code behandeln, wenn Sie diesen Dienst nutzen. Weitere Informationen zu Fehlerausnahmen in WCF finden Sie in diesem MSDN-Artikel.

Sie können auch eine benutzerdefinierte Fehlerklasse erstellen, die mit dem DataContract-Attribut gekennzeichnet ist.

[Datenvertrag]

öffentliche Klasse CustomFault

{

[DataMember]

öffentliche Zeichenfolge Quelle;

[DataMember]

öffentliche Zeichenfolge ExceptionMessage;

[DataMember]

öffentliche Zeichenfolge InnerException;

[DataMember]

öffentlicher String StackTrace;

}}

Das folgende Codeausschnitt zeigt, wie Sie mit der CustomFault-Klasse eine stark typisierte FaultException auslösen können.

void Save (Mitarbeiter emp)

{

Versuchen

{

  // Code zum Speichern des Mitarbeiterobjekts in der Datenbank

}}

fangen (Ausnahme ex)

{

CustomFault cx = neuer CustomFault ();

neue FaultException auslösen (z. B. neue FaultReason ("Dies ist eine stark typisierte fehlerhafte Ausnahme"));

}}

}}

Sie müssten auch das FaultContract-Attribut in Ihrer Servicemethode angeben, das die FaultException auslösen würde. Die modifizierte Speichermethode würde so aussehen.

[Servicevertrag]

öffentliche Schnittstelle IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        void Save (Employee emp);

    }}

Verwenden von returnUnknownExceptionsAsFaults

Sie können das Attribut returnUnknownExceptionsAsFaults in der Dienstverhaltenskonfiguration verwenden, um eine Ausnahme automatisch als SOAP-Fehler auszulösen. Das folgende Codefragment zeigt, wie Sie dies erreichen können.

                 returnUnknownExceptionsAsFaults = "True">

Ausnahmen global behandeln

Eine andere Möglichkeit, Ausnahmen in WCF zu behandeln, besteht darin, die IErrorHandler-Schnittstelle in Ihrer Serviceklasse zu implementieren, um alle Ausnahmen global zu behandeln und eine SOAP-kompatible FaultException bereitzustellen. Diese Schnittstelle enthält zwei Methoden - HandleError und ProvideFault. Während Ersteres verwendet wird, um eine Aktivität mit dem Fehler auszuführen, wird Letzteres verwendet, um eine Fehlermeldung zurückzugeben. Beachten Sie, dass Sie IErrorHandler auch in Ihrer konfigurierbaren Dienstdatei konfigurieren (ein- oder ausschalten) können.