2010-07-14 25 views
5

¿Es posible obtener un servicio WCF para devolver un 'error' al cliente? Me hacen creer que esto es posible cuando utilizo SOAP, pero me gustaría regresar con JSON.Servicio WCF para devolver fallas con formato JSON

Idealmente, el código de respuesta HTTP se establecería en algo para indicar que se produjo un error, y luego los detalles del problema estarían disponibles en la respuesta JSON.

Actualmente, estoy haciendo algo como esto:

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    [FaultContract(typeof(TestFault))] 
    public MyResult MyMethod() 
    { 
     throw new FaultException<TestFault>(new TestFault("Message..."), "Reason..."); 
    } 
} 

Dónde TestFault se parece a esto:

[DataContract] 
public class TestFault 
{ 
    public TestFault(string message) 
    { 
     this.Message = message; 
    } 

    [DataMember] 
    public string Message { get; set; } 
} 

No hay nada particularmente especial en la configuración del servicio en el momento.

Esto da como resultado una respuesta '400 Bad Request', con un error de formato HTML. (Cuando includeExceptionDetailInFaults, puedo ver la 'Razón ...' y detalles de la FaultException, pero no dio detalles sobre la TestFault.)

servicio

La web devuelve JSON bien cuando un Exception (o FaultException) no está siendo arrojado.

Cualquier sugerencia ...?

+0

otro intento de resolver esto aquí http://iainjmitchell.com/blog/?p=142 –

Respuesta

7

Editar: enlace fijo + resumen agregado.

Usted puede encontrar una explicación y una solución here

Para resumir la solución desde el enlace, se extienden WebHttpBehavior y anular AddServerErrorHandlers con el fin de añadir su propia implementación de IErrorHandler. Esta implementación extraerá el error de la llamada de servicio y generará información de falla.

El artículo vinculado también muestra cómo escribir su propia fábrica de host de servicio que establece este comportamiento.

+0

Gracias Timores. Trabajé con esto, pero configuré un 'BehaviorExtensionElement' para que el comportamiento se pudiera especificar en el archivo de configuración. –

+0

Tuve que rechazar, porque la solución vinculada ya no existe. – Andreas

+1

@Andreas, tienes razón. Arreglé el enlace y resumí sus contenidos. – Timores

12

Todo lo que necesita es posible a partir de .NET 4. vea here para más detalles. Por ejemplo:

throw new WebFaultException<string>(
    "My error description.", HttpStatusCode.BadRequest); 
+1

Parece que podría haber funcionado, pero desafortunadamente requiere .NET 4, que no puedo usar en este caso. –

1

La respuesta de error de la llamada jQuery.ajax() debe tener este aspecto:

error: function (xhr, status, error) { 
    var responseObj = JSON.parse(xhr.responseText); 
    alert('Request failed with error: "' + responseObj.Message); 
} 

En su servicio WCF, pase una excepción al constructor WebFaultException. Su mensaje personalizado estará accesible a través de responseObj.Message en el javascript arriba:

public class AJAXService : IAJAXService 
{ 
    public void SomeMethod() 
    { 
    throw new WebFaultException<Exception>(new Exception("some custom error message!"), HttpStatusCode.InternalServerError); 
    } 
} 
Cuestiones relacionadas