有些同事和我遇到問題,即來自ajax調用的響應返回一些意外的內容。 result.responseText的值不是使用各種屬性返回簡單的JSON對象,而是通用的406狀態錯誤頁面的HTML標記,表示瀏覽器不接受MIME類型。406返回JSON對象時出錯 - 意外的內容
電話可以撥出像這樣:
$.ajax({
url: '/promociones/cincogratis/canjear-codigo-promocional',
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('.promotion_banner .loader').hide();
$('.promotion_banner').html(result);
},
error: function (result) {
var obj = result.responseText;
if (obj.isRedirect) {
document.location = obj.redirectUrl;
}
else {
$('.promotion_banner .loader').hide();
$(".error-wrapper").removeClass("hidden");
var generic_error = document.getElementById('generic_error').value;
$(".error-wrapper p").html(generic_error);
}
},
beforeSend: function() {
$('.promotion_banner .loader').show();
}
});
控制器響應政府號召是像這樣:
Response.StatusCode = (int)HttpStatusCode.NotAcceptable; // 406
return Json(new { errorMessage = LocalErrorMessages.Website_Promotions_FreeFiver_General_Problem, isRedirect = false });
我們希望result.responseText以包含的errorMessage和isRedirect鍵值,但他們不在那裏。
值得指出的是,這段代碼是多租戶的,由當前應用程序共享,另一個則完全正常。
我們已經嘗試過:
- 配置IIS顯示詳細的錯誤響應而不是自定義頁面以獲取更多詳細信息 - 爲解決問題提供了額外的幫助。
- 允許所有響應的內容類型的號召
- 改變我們網站的文化(這是目前ES-ES)
- 各種web.config中調整
有沒有人有這個問題?
如果服務器不支持客戶端發送的各種「Accept」頭,則應使用「406」。這是你的錯誤反應的真正含義嗎?我不認爲HTTP錯誤是正確的方法;也許你應該返回一個'200',並且客戶端會檢查響應以確定它是否是錯誤的(或者可能有更正確的狀態碼)。 – Jacob 2013-05-01 18:58:03
根據這個答案,'403'可能是一個更好的選擇,也許它會保存你的JSON:http://stackoverflow.com/a/3290369/119549 – Jacob 2013-05-01 19:03:32
感謝Jacob。 HTTP是一種應用程序級別的協議,因此我們使用4xx作爲告訴瀏覽器存在業務錯誤的方式。不尋常的是,服務器返回的406響應是核心代碼庫的一部分(我們的每個應用程序在這裏都使用相同的代碼),並且我們僅遇到其中一個應用程序的這個問題。 – 2013-05-02 09:39:48