2013-08-15 30 views
7

Mã này sử dụng ngăn xếp Microsoft Web Api Http và jQuery.Cách nhận thông báo lỗi tùy chỉnh từ Web Api tới jQuery.ajax?

Làm thế nào để tôi nhận được một thông báo lỗi tùy chỉnh, tạo ra bởi một HttpError tham số để CreateErrorResponse(), hiển thị bằng jQuery deferred.fail()?

Một ví dụ của việc tạo ra một phản ứng lỗi cho mục đích thử nghiệm bên trong ApiController:

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

Dưới đây là một khách hàng cắt giảm đó là cố gắng tìm các thông báo lỗi để hiển thị, "Thất bại trong việc ăn trưa.".

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

gì sẽ được hiển thị là:

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

Những gì tôi muốn thay thế là:

"Failure to lunch."

+0

Bạn có nghĩa là "fa ilure để khởi động "không ăn trưa –

+3

@KevinHolditch Tôi đã đói! – Boggin

+1

vì vậy bây giờ tôi đã đọc câu hỏi của bạn :) –

Trả lời

6

Bạn có thể phân tích các chuỗi responseText và sau đó sử dụng Message tài sản:

.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

Đây là nơi tôi đang bối rối. jqXhr.responseText.Message có thông báo lỗi từ InternalServerError ("Đã xảy ra lỗi."), không phải là thông báo tùy chỉnh mà tôi đưa vào HttpError. – Boggin

+0

Tôi đã mắc sai lầm trong câu trả lời của mình. Bạn nên sử dụng 'alert (error.Message)' thay vì 'alert (error) .Message'. Thuộc tính Message sẽ chứa văn bản 'Failure to lunch.'. Tôi vừa thử nghiệm nó và nó hoạt động tốt. Bạn có thể hiển thị giá trị của 'jqXhr.responseText' không? –

+0

Tôi đã bối rối, hóa ra, vì trường hợp thử nghiệm của tôi ở đây đang ném * một trường hợp ngoại lệ khác * InternalServerError đã được trả về trước khi mã CreateErrorResponse của tôi bị tấn công. API Web sẽ thoải mái đối phó với điều này trong trường hợp không có bất kỳ mã try..catch nào. Bạn hoàn toàn đúng, thuộc tính Message là thứ tôi cần. – Boggin

Các vấn đề liên quan