No aparece el mensaje de error REST WCF BadRequest en .NET 3.5

Tengo una aplicación REST WCF desarrollada en .NET 3.5.

Para verificar si hay una URL de solicitud no válida, como por ejemplo, parámetros faltantes, etc. Estoy usando una clase que implementa la interfaz "IErrorHandler". Entonces, dentro de esa clase, tengo esta sección de código que se supone que genera un código y mensaje de error BadRequest:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            ExceptionHelper.HandleException(error, Severity.Error);
            StatusResponseBE statusResponseEntity = new StatusResponseBE();
            statusResponseEntity.Code = STATUS_CODE_FAIL;
            statusResponseEntity.Message = "Failed to perform requested operation";
            statusResponseEntity.Errors = new ErrorResponseBECollection();

            if (error is SerializationException || error is InvalidOperationException)
            {
                statusResponseEntity.Errors.Add(new ErrorResponseBE()
                {
                    Code = EX_INVALID_REQUEST_CODE,
                    Description = "Invalid Request"
                });
                fault = Message.CreateMessage(version, string.Empty, statusResponseEntity, new DataContractJsonSerializer(typeof(StatusResponseBE)));
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
                WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.BadRequest;
                return;
            }
            else
            {
                statusResponseEntity.Errors.Add(new ErrorResponseBE()
                {
                    Code = EX_INTERNAL_ERROR_CODE,
                    Description = "Internal Error"
                });
                fault = Message.CreateMessage(version, string.Empty, statusResponseEntity, new DataContractJsonSerializer(typeof(StatusResponseBE)));
                fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
                WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
                return;

            }

        }

Pero cuando accedo a mi servicio WCF con una URL de solicitud no válida, recibo un código de error BadReqest como 400, pero no un mensaje en la respuesta JSON como "Código: 400; Mensaje: Solicitud no válida"

HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.0
Access-Control-Allow-Origin: *
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=xz412e35vruepr45qjrp5lyw; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Thu, 03 May 2012 14:47:15 GMT
Content-Length: 1165

<?xml version="1.0" encoding="utf-8"?><HTML><HEAD><STYLE type="text/css">#content{ FONT-SIZE: 0.7em; PADDING-BOTTOM: 2em; MARGIN-LEFT: 30px}BODY{MARGIN-TOP: 0px; MARGIN-LEFT: 0px; COLOR: #000000; FONT-FAMILY: Verdana; BACKGROUND-COLOR: white}P{MARGIN-TOP: 0px; MARGIN-BOTTOM: 12px; COLOR: #000000; FONT-FAMILY: Verdana}PRE{BORDER-RIGHT: #f0f0e0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #f0f0e0 1px solid; MARGIN-TOP: -5px; PADDING-LEFT: 5px; FONT-SIZE: 1.2em; PADDING-BOTTOM: 5px; BORDER-LEFT: #f0f0e0 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #f0f0e0 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e5e5cc}.heading1{MARGIN-TOP: 0px; PADDING-LEFT: 15px; FONT-WEIGHT: normal; FONT-SIZE: 26px; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 3px; MARGIN-LEFT: -30px; WIDTH: 100%; COLOR: #ffffff; PADDING-TOP: 10px; FONT-FAMILY: Tahoma; BACKGROUND-COLOR: #003366}.intro{MARGIN-LEFT: -15px}</STYLE>
<TITLE>Request Error</TITLE></HEAD><BODY>
<DIV id="content">
<P class="heading1">Request Error</P>
<BR/>
<P class="intro">The server encountered an error processing the request. See server logs for more details.</P>
<P class="intro"></P>
</DIV>
</BODY></HTML>

En cambio, obtengo lo anterior en la pestaña Raw en Fiddler.

¿Alguna idea de por qué sucede esto y qué puedo hacer para solucionarlo? Me ha estado molestando mucho y lo he intentado todo, pero no parece funcionar como debería.

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

2 Respuestas

Este es un problema del WebServiceHost que supongo que está utilizando para ese servicio. El WebServiceHost2 del WCF Rest Starter Kit 2 debería permitirle especificar una carga json personalizada para sus errores lanzando WebProtocolExceptions

Puedes revisar esto para más detalles http://www.robbagby.com/rest/effective-error-handling-with-wcf-rest/

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

Gracias por la ayuda, Javi. Estoy usando "System.ServiceModel.Activation.WebScriptServiceHostFactory" para mi aplicación actual. Cuando trato de usar "Microsoft.ServiceModel.Web.WebServiceHost2Factory", mi aplicación no responde en absoluto. - Anupam

Prueba esta

var message = ex.GetOriginalMessage();
var statusCode = (ex is MyDomainException || ex.GetType().IsSubclassOf(typeof (MyDomainException)))
                        ? HttpStatusCode.BadRequest
                        : HttpStatusCode.InternalServerError;

var context = WebOperationContext.Current;

if (context == null || context.IncomingRequest.ContentType.ToLower().Contains("json"))
    throw new WebProtocolException(statusCode, statusCode.ToString(), message, null);

throw new WebProtocolException(statusCode, statusCode.ToString(), new XElement("Detail", message), false, null);

Respondido 01 Oct 14, 19:10

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