Manejo de errores del servicio WCF Rest y WebChannelFactory

Según tengo entendido, lo siguiente debería arrojar correctamente un error personalizado de un servicio WCF Rest:

[DataContract(Namespace = "")]
public class ErrorHandler
{
    [DataMember]
    public int errorCode { get; set; }

    [DataMember]
    public string errorMessage { get; set; }
} // End of ErrorHandler

public class Implementation : ISomeInterface
{
    public string SomeMethod()
    {
        throw new WebFaultException<ErrorHandler>(new ErrorHandler()
        {
            errorCode = 5,
            errorMessage = "Something failed"
        }, System.Net.HttpStatusCode.BadRequest);
    }
}

En Fiddler esto parece funcionar, obtengo los siguientes datos sin procesar:

HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 145
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=gwsy212sbjfxdfzslgyrmli1; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Thu, 03 May 2012 17:49:14 GMT

<ErrorHandler xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><errorCode>5</errorCode><errorMessage>Something failed</errorMessage></ErrorHandler>

Pero ahora en mi lado del cliente tengo el siguiente código:

WebChannelFactory<ISomeInterface> client = new WebChannelFactory<ISomeInterface>(new Uri(targetHost));

ISomeInterface someInterface = client.CreateChannel();
try
{
  var result = someInterface.SomeMethod();
}
catch(Exception ex)
{
   // Try to examine the ErrorHandler to get additional details.
}

Ahora, cuando el código se ejecuta, presiona el botón y es un System.ServiceModel.ProtocolException con el mensaje 'El servidor remoto devolvió una respuesta inesperada: (400) Solicitud incorrecta'. Parece que no tengo forma de ver los detalles de ErrorHandler en este momento. ¿Alguien se ha encontrado con esto? ¿Hay alguna manera de obtener los detalles de ErrorHander en este momento?

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

WebChannelFactory or ChannelFactory solo le revelará el genérico CommunicationException. Necesitará usar un IClientMessageInspector comportamiento o confiar en WebRequest para devolver el error real.

Para el IClientMessageInspector enfoque - ver los comentarios en esta entrada de blog.

Para el WebRequest enfoque, puede hacer lo siguiente para atrapar el WebException.

try { }
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(WebException)))
    {
        WebException webEx = ex as WebException;
        if (webEx.Status == WebExceptionStatus.ProtocolError)
        {
            using (StreamReader exResponseReader = new StreamReader(webEx.Response.GetResponseStream()))
            {
                string exceptionMessage = exResponseReader.ReadToEnd();
                Trace.TraceInformation("Internal Error: {0}", exceptionMessage);
            }
        }
    }
}

contestado el 03 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.