2013-08-15 8 views
7

Ten kod używa stosu Microsoft Web Api Http i jQuery.Jak uzyskać niestandardowy komunikat o błędzie z Web Api do jQuery.ajax?

Jak mogę dostać niestandardowy komunikat o błędzie, stworzony przez httpError parametr do CreateErrorResponse(), wyświetlany przez jQuery deferred.fail()?

Przykładem tworzenia odpowiedzi błędu dla celów testowych w ApiController:

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

Oto cut-down klient, który próbuje znaleźć komunikat o błędzie wyświetlany, „Miłość na zamówienie”..

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

Co będzie wyświetlany jest:

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

Czego chcę zamiast jest:

"Failure to lunch."

+0

Czy masz na myśli "fa ilure wystartuje "nie lunch –

+3

@KevinHolditch Byłem głodny! – Boggin

+1

więc jestem teraz przeczytałem twoje pytanie :) –

Odpowiedz

6

Można analizować ciąg responseText a następnie użyć właściwości 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

To jest, gdzie jestem zmieszany. jqXhr.responseText.Message ma komunikat o błędzie z InternalServerError ("Wystąpił błąd."), a nie niestandardowy komunikat, który wpisuję w HttpError. – Boggin

+0

Popełniłem błąd w mojej odpowiedzi. Powinieneś użyć 'alert (error.Message)' zamiast 'alert (error) .Message'. Właściwość Message będzie zawierała tekst "Failure to lunch". Właśnie to przetestowałem i wszystko działało dobrze. Czy mógłbyś pokazać wartość 'jqXhr.responseText'? –

+0

Byłem zdezorientowany, jak się okazało, ponieważ w moim przypadku testowym wyrzucano * inny wyjątek * InternalServerError, który był zwracany przed trafieniem mojego kodu CreateErrorResponse. Web API wygodnie poradzi sobie z tym pod nieobecność jakiegokolwiek kodu try..catch. Masz całkowitą rację, właściwość Message jest tym, czego potrzebowałem. – Boggin

Powiązane problemy