2010-07-14 29 views
5

È possibile ottenere un servizio WCF per restituire un 'errore' al client? Sono portato a credere che questo sia possibile quando si usa SOAP, ma mi piacerebbe tornare JSON.Servizio WCF per restituire errori formattati JSON

Idealmente, il codice di risposta HTTP dovrebbe essere impostato su qualcosa per indicare che si è verificato un errore e quindi i dettagli del problema sarebbero disponibili nella risposta JSON.

Attualmente, sto facendo qualcosa di simile:

[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..."); 
    } 
} 

Dove TestFault assomiglia a questo:

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

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

Non c'è niente di particolarmente speciale nella configurazione del servizio al momento.

Ciò comporta una risposta '400 Richiesta non valida', con un errore in formato HTML. (Quando ho includeExceptionDetailInFaults, posso vedere la 'ragione ...' e dettagli della FaultException, ma nessun dettaglio sul TestFault.)

servizio

Il Web restituisce JSON ok quando un Exception (o FaultException) non è essere gettato.

Qualche suggerimento ..?

+0

l'ennesimo tentativo di risolvere questo qui http://iainjmitchell.com/blog/?p=142 –

risposta

7

Modifica: collegamento fisso + sommario aggiunto.

Si può trovare una spiegazione e una soluzione here

Per riassumere la soluzione dal link, estendere WebHttpBehavior e sovrascrivere AddServerErrorHandlers per aggiungere la propria implementazione di IErrorHandler. Questa implementazione estrae l'errore dalla chiamata di servizio e genera informazioni di errore.

L'articolo collegato mostra anche come scrivere il proprio Host Factory di servizio che imposta questo comportamento.

+0

Grazie Timores. Ho lavorato da questo, ma ho impostato un 'BehaviorExtensionElement' in modo che il comportamento potesse essere specificato nel file di configurazione. –

+0

Ha dovuto votare in negativo, perché la soluzione collegata non esiste più. – Andreas

+1

@Andreas, hai ragione. Ho riparato il collegamento e ho riassunto il suo contenuto. – Timores

12

Tutto ciò di cui hai bisogno è possibile a partire da .NET 4. vedi here per i dettagli. Per esempio:

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

Sembra che potrebbe aver funzionato, ma richiede sicuramente .NET 4, che non posso usare in questo caso. –

1

La richiamata errore della chiamata jQuery.ajax() dovrebbe apparire come segue:

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

nel servizio WCF, passano un'eccezione al costruttore WebFaultException. Il tuo messaggio personalizzato sarà accessibile tramite responseObj.Message nella javascript sopra:

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