10

This code uses the Microsoft Web Api Http stack and jQuery.

How do I get a custom error message, created by an HttpError parameter to CreateErrorResponse(), displayed by jQuery's deferred.fail()?

An example of creating an error response for test purposes in an ApiController:

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

Here's a cut-down client that's trying to find the error message to display, "Failure to lunch.".

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

What will be displayed is:

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

What I want instead is:

"Failure to lunch."

Boggin
  • 3,251
  • 3
  • 33
  • 48

1 Answers1

8

You could parse the responseText string and then use the Message property:

.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');
    }
});
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
  • This is where I'm getting confused. jqXhr.responseText.Message has the error message from the InternalServerError ("An error has occurred."), not the custom message I put into HttpError. – Boggin Aug 15 '13 at 13:15
  • I made a mistake in my answer. You should use `alert(error.Message)` instead of `alert(error).Message`. The Message property will contain the text `Failure to lunch.`. I have just tested it and it worked fine. Could you show the value of `jqXhr.responseText`? – Darin Dimitrov Aug 15 '13 at 13:18
  • I was confused, it turns out, because my test case here was throwing *another* InternalServerError exception which was being returned before my CreateErrorResponse code was being hit. The Web API will comfortably cope with this in the absence of any try..catch code. You're quite right, the Message property is what I needed. – Boggin Aug 15 '13 at 13:33