Servicios web de WCF, que devuelve una cadena de error / excepción

Tengo un conjunto de servicios web WCF que, si se produce una excepción, utilizaránOutgoingWebResponseContext para devolver la descripción del error a la persona que llama.

Mi problema es que a veces, cuando algo sale mal, el servicio web se muestra comoha fallado, con un mensaje ERR_CONNECTION_RESET, en lugar de devolver el mensaje de error, y me gustaría evitar que esto suceda.

Por ejemplo, aquí está mi hermoso código C # que consulta miNorthwind base de datos y devuelve una lista deCustomer nombres

O mejor,haría, pero deliberadamente he metido una excepción allí.

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;
    }
}

En mi controlador AngularJS, puedo llamar a este servicio web ...

$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);

    });

... y si se produce esta excepción, veo el mensaje de excepción completo ...

Maravilloso.

Para todos los lectores, que han querido conocer una forma simple y genérica de devolver y mostrar Excepciones de sus servicios web WCF, ¡ahí está su solución!

Bien, ahora eliminaré mi línea de código de Excepción y el servicio web volverá a funcionar bien. losCustomer los datos se devuelven al controlador angular sin ningún problema.

Pero ... si se produce una excepción al conectarse a la base de datos (por ejemplo, se agota el tiempo, tengo un nombre de base de datos incorrecto en mi cadena de conexión, etc.), entonces la siguiente línea de códigohace lanzar una excepción ...

NorthwindDataContext dc = new NorthwindDataContext();

...micatch códigohace patear (pongo un punto de interrupción para verificar), y configuramos StatusDescription para el mensaje de excepción.

Pero la respuesta que se envía de vuelta no contiene mi número de estado HTTP o texto.

Mi controlador angular acaba de recibir un código de estado HTTP de 0, sin mensaje de estado.

Y si presiono F12 en Chrome, puede ver que en realidad dice el servicio webha fallado, en lugar de devolver el Código de estado 403, y no hay ningún mensaje.

Entonces mi pregunta es simple, ¿hay alguna manera de evitar que ocurra esta falla?

Obviamente, es mucho más amigable devolver una descripción de lo que salió mal, en lugar de simplemente "El servicio web falló miserablemente ... pero no podemos decirle por qué".

Si puedo superar este problema, esta sería una buena manera de hacer que todos nuestros servicios web WCF sean amigables con los mensajes de error en nuestras aplicaciones internas. Pero, por supuesto, para los sistemas de producción, seguro, no querrás bombardear al usuario con mensajes de excepción técnica.

Actualización, muchas horas después ...

Encontré la causa y la solución.

¿Estás listo para esto?

El problema era que cuando elDataContext la línea lanzó una excepción ...

NorthwindDataContext dc = new NorthwindDataContext();

... el mensaje de excepción tenía unlinea de alimentación en eso.

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.

Ese avance de línea estaba causando el problema. Si intentas devolver eso en unStatusDescription campo, hace que todo el servicio web se informe como "fallido".

Por lo tanto, la solución es simplemente eliminar cualquier salto de línea antes de devolver el mensaje de excepción.

Así que aquí, finalmente, hay un ejemplo de cómo usar untry..catch en sus servicios web WCF, por lo que siempre devolverán mensajes de excepción a la persona que llama.

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;
    }
}

¡Gracias por todas sus sugerencias!

Respuestas a la pregunta(0)

Su respuesta a la pregunta