2013-05-01 98 views
6

有些同事和我遇到問題,即來自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中調整

有沒有人有這個問題?

+0

如果服務器不支持客戶端發送的各種「Accept」頭,則應使用「406」。這是你的錯誤反應的真正含義嗎?我不認爲HTTP錯誤是正確的方法;也許你應該返回一個'200',並且客戶端會檢查響應以確定它是否是錯誤的(或者可能有更正確的狀態碼)。 – Jacob 2013-05-01 18:58:03

+0

根據這個答案,'403'可能是一個更好的選擇,也許它會保存你的JSON:http://stackoverflow.com/a/3290369/119549 – Jacob 2013-05-01 19:03:32

+0

感謝Jacob。 HTTP是一種應用程序級別的協議,因此我們使用4xx作爲告訴瀏覽器存在業務錯誤的方式。不尋常的是,服務器返回的406響應是核心代碼庫的一部分(我們的每個應用程序在這裏都使用相同的代碼),並且我們僅遇到其中一個應用程序的這個問題。 – 2013-05-02 09:39:48

回答

0

簡化您的請求。可能是這樣的:

$.ajax({ 
    url: '/promociones/cincogratis/canjear-codigo-promocional', 
    type: 'GET', 
    data: {foo:'bar', one:'two'}, 
    dataType: 'json', 
    success: function (result) { 
      console.dir(result); 
    }, 
    error: function (xhr) { 
      console.dir(xhr) 
    } 
}); 

並從服務器發佈響應。這種錯誤似乎是一個請求問題,而不是服務器配置問題

+0

我認爲這個問題是爲什麼包含在錯誤中的JSON沒有出現,而不是爲什麼錯誤被接收到(它預計會得到一個406) – Jacob 2013-05-01 18:48:11

+0

這就是爲什麼我在參數中設置dataType:'json'認爲jQuery有問題解釋頭的接受 – 2013-05-01 18:55:48

+0

406錯誤狀態是在OP的代碼中明確發送的東西 – Jacob 2013-05-01 18:59:12