2013-08-15 10 views
7

Questo codice utilizza lo stack HTTP Microsoft Web Api e jQuery.Come ottenere un messaggio di errore personalizzato da Web Api a jQuery.ajax?

Come ottengo un messaggio di errore personalizzato, creato da un HTTPError parametro CreateErrorResponse(), visualizzata da deferred.fail di jQuery()?

Un esempio di creazione di una risposta di errore per scopi di test in un ApiController:

public HttpResponseMessage Post(Region region) 
{ 
    var error = new HttpError("Failure to lunch."); 
    return this.Request.CreateErrorResponse(
       HttpStatusCode.InternalServerError, 
       error); 
} 

Ecco un client cut-down che sta cercando di trovare il messaggio di errore da visualizzare, "A casa con i suoi.".

$.ajax({ 
    type: 'POST', 
    url: 'api/region', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(region) 
}) 
.fail(function (jqXhr, textStatus, errorThrown) { 
    alert(textStatus + ": " + errorThrown + ": " + jqXhr.responseText); 
}); 

Quale sarà visualizzato è:

"error: Internal Server Error: {full stack here}"

Quello che voglio invece è:

"Failure to lunch."

+0

Vuoi dire "fa ilure per lanciare "non pranzo –

+3

@KevinHolditch avevo fame! – Boggin

+1

così ora ho letto la tua domanda :) –

risposta

6

Si potrebbe analizzare la stringa responseText e quindi utilizzare la proprietà Message:

.fail(function (jqXhr, textStatus, errorThrown) { 
    if (jqXhr.getResponseHeader('Content-Type').indexOf('application/json') > -1) { 
     // only parse the response if you know it is JSON 
     var error = $.parseJSON(jqXhr.responseText); 
     alert(error.Message); 
    } else { 
     alert('Fatal error'); 
    } 
}); 
+0

Questo è il punto in cui mi sto confondendo. jqXhr.responseText.Message ha il messaggio di errore da InternalServerError ("Si è verificato un errore."), non il messaggio personalizzato che ho inserito in HttpError. – Boggin

+0

Ho fatto un errore nella mia risposta. Dovresti usare 'alert (error.Message)' invece di 'alert (error) .Message'. La proprietà Message conterrà il testo "Failure to lunch". L'ho appena testato e ha funzionato bene. Potresti mostrare il valore di 'jqXhr.responseText'? –

+0

Ero confuso, risulta, perché il mio test case stava lanciando * un'altra eccezione InternalServerError * che era stata restituita prima che venisse colpito il mio codice CreateErrorResponse. L'API Web sarà in grado di far fronte a questo problema in assenza di qualsiasi codice try..catch. Hai perfettamente ragione, la proprietà Message è ciò di cui avevo bisogno. – Boggin

Problemi correlati