WCF Web Services, Rückgabe einer Fehler- / Ausnahmekette

Ich habe eine Reihe von WCF-Webdiensten, die im Ausnahmefall @ verwendeOutgoingWebResponseContext, um die Fehlerbeschreibung an den Aufrufer zurückzugeben.

Mein Problem ist, dass manchmal, wenn etwas schief geht, der Webdienst als @ angezeigt wigescheiter mit einer ERR_CONNECTION_RESET-Nachricht, anstatt die Fehlermeldung zurückzugeben, und ich möchte dies verhindern.

Zum Beispiel ist hier mein schöner C # -Code, der mein @ abfraNorthwind database und gibt eine Liste von @ zurüCustomer names.

Oder eher,s würde t, aber ich habe absichtlich eine Ausnahme darin stecken.

public List<string> GetAllCustomerNames()
{
    //  Get a list of unique Customer names.
    //
    try 
    {
        throw new Exception("Oh heck, something went wrong !");

        NorthwindDataContext dc = new NorthwindDataContext();
        var results = (from cust in dc.Customers select cust.CompanyName).Distinct().OrderBy(s => s).ToList();

        return results;
    }           
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = System.Net.HttpStatusCode.InternalServerError;
        response.StatusDescription = ex.Message;
        return null;
    }
}

uf meinem AngularJS-Controller kann ich diesen Webdienst aufrufen .

$http.get('http://localhost:15021/Service1.svc/getAllCustomerNames')
    .then(function (data) {
        //  We successfully loaded the list of Customer names.
        $scope.ListOfCustomerNames = data.GetAllCustomerNamesResult;

    }, function (errorResponse) {

        //  The WCF Web Service returned an error

        var HTTPErrorNumber = errorResponse.status;
        var HTTPErrorStatusText = errorResponse.statusText;

        alert("An error occurred whilst fetching Customer Names\r\nHTTP status code: " + HTTPErrorNumber + "\r\nError: " + HTTPErrorStatusText);

    });

... und wenn diese Ausnahme auftritt, wird die vollständige Ausnahmemeldung angezeigt ...

Wunderbar.

Für alle Leser, die eine einfache und allgemeine Methode zur Rückgabe und Anzeige von Ausnahmen von Ihren WCF-Webdiensten kennen möchten, gibt es Ihre Lösung!

Okay, jetzt entferne ich meine Exception-Codezeile und der Webdienst läuft wieder einwandfrei. DasCustomer -Daten werden ohne Probleme an den Angular-Controller zurückgegeben.

Aber .. wenn beim Herstellen einer Verbindung zur Datenbank eine Ausnahme auftritt (z. B. wenn das Zeitlimit überschritten wird, ich habe den falschen Datenbanknamen in meiner Verbindungszeichenfolge usw.), dann die folgende Codezeile does eine Ausnahme auslösen ...

NorthwindDataContext dc = new NorthwindDataContext();

... meincatch code does kick in (ich habe einen Haltepunkt gesetzt, um dies zu überprüfen), und wir setzen die Statusbeschreibung auf die Exception-Nachricht.

Aber die Antwort, die zurückgesendet wird, enthält weder meine HTTP-Statusnummer noch Text.

Mein Angular-Controller erhält nur den HTTP-Statuscode 0 ohne StatusMessage.

Und wenn ich in Chrome F12 drücke, kannst du sehen, dass dort tatsächlich der Webdienst stehtgescheiter, anstatt den Statuscode 403 zurückzugeben, und es wird keine Nachricht angezeigt.

So ist meine Frage einfach, gibt es eine Möglichkeit, diesen Fehler zu verhindern?

Offensichtlich ist es viel einfacher, eine Beschreibung des Fehlers zurückzugeben, als nur "Der Webdienst ist kläglich fehlgeschlagen ... aber wir können Ihnen nicht sagen, warum."

Wenn ich dieses Problem lösen kann, ist dies eine gute Möglichkeit, alle Fehlermeldungen unserer WCF-Webservices in unseren internen Apps anzuzeigen. Aber natürlich möchten Sie für Produktionssysteme den Benutzer nicht wirklich mit technischen Ausnahmemeldungen bombardieren.

Update, viele Stunden später ..

ch habe die Ursache und die Lösung gefunde

Bist du bereit für das

Das Problem war, dass, wenn dieDataContext line hat eine Ausnahme ausgelöst ...

NorthwindDataContext dc = new NorthwindDataContext();

... die Ausnahmemeldung hatte ein line-feed drin

Cannot open database "Northwind" requested by the login. 
The login failed.Login failed for user 'MikesWrongUserName'.This session has been assigned a tracing ID of '1f0513d1-9ce1-47ef-9d44-1f4546eb0b73'.  Provide this tracing ID to customer support when you need assistance.

Dieser Zeilenvorschub hat das Problem verursacht. Wenn Sie versuchen, das in einem @ zurückzugebStatusDescription -Feld wird der gesamte Webdienst als "fehlgeschlagen" gemeldet.

So besteht die Lösung darin, einfach alle Zeilenvorschübe zu entfernen, bevor Sie die Ausnahmemeldung zurückgeben.

So hier ist schließlich ein Beispiel für die Verwendung einestry..catch in Ihren WCF-Webdiensten, sodass sie immer Ausnahmemeldungen an den Anrufer zurücksenden.

public List<string> GetAllCustomerNames()
{
    //  Get a list of unique Company Names.
    //
    try
    {
        NorthwindDataContext dc = new NorthwindDataContext();
        var results = (from cust in dc.Customers select cust.CompanyName).Distinct().OrderBy(s => s).ToList();

        return results;
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = System.Net.HttpStatusCode.InternalServerError;

        //  If a database Exception occurs, it might have a line-feed in it, 
        //  which will cause the web service to completely fail  (no Status
        //  Code or Status Message will get returned.)
        response.StatusDescription = ex.Message.Replace("\r\n", "");
        return null;
    }
}

Vielen Dank für alle Ihre Vorschläge!

Antworten auf die Frage(0)

Ihre Antwort auf die Frage