2014-07-01 72 views
0

我有下面的示例代碼,它在我的本地開發環境中工作,但發佈到使用HTTPS並使用.NET捆綁的JavaScript和ELMAH對於錯誤記錄,這不再按預期工作。jquery ajax後json內容類型返回錯誤的請求爲HTML

而不是JSON內容響應我得到一個HTML內容響應responseText「錯誤的請求」,並沒有responseJSON屬性,所以這段代碼導致一個JavaScript錯誤。

有誰知道爲什麼內容類型會改變?大概是由於這是在一個現場環境和400響應代碼?但我不確定這裏發生了什麼。

控制器:

 public JsonResult JsonModelErrorResult() 
     { 
      Response.StatusCode = 400; 
      var errors = ModelState.Values.SelectMany(m => m.Errors); 
      return Json(errors); 
     } 

     [HttpPost] 
     public ActionResult GetData() 
     { 
... 
      if (results != null && results.Any()) 
      { 
       return Json(result, JsonRequestBehavior.AllowGet); 
      } 
      else 
      { 
       ModelState.AddModelError("SearchResults", "No results found"); 
       return this.JsonModelErrorResult(); 
      } 
     } 

使用Javascript:

$.ajax("/Controller/GetData/", { 
       dataType: "json", 
       type: "POST", 
       contentType: "application/json" 
      }) 
      .done((result) => { 
      }) 
      .fail((xhr) => { 
       setTimeout(() => { 
        this.errors(xhr.responseJSON); 
       }, 200); 
      }) 
      .always(() => { 
      }); 

更新:

這是響應標頭時,我認爲在Chrome請求的響應:

HTTP/1.1 400 Bad Request 
Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Content-Type: text/html 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNetMvc-Version: 4.0 
X-AspNet-Version: 4.0.30319 
Persistent-Auth: true 
X-Powered-By: ASP.NET 
Date: Thu, 03 Jul 2014 12:08:23 GMT 
Content-Length: 11 

,並從Ajax調用返回的值是與"Bad Request"一個responseText財產和"text/html"

更新的內容類型一個jQuery jqXHR對象2: 這是自定義錯誤設置在我的網頁的.config

<customErrors mode="RemoteOnly" defaultRedirect="~/Error"> 
    <error statusCode="401" redirect="~/Error/NotAuthorised" /> 
    <error statusCode="403" redirect="~/Error/NotAuthorised" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

當測試我改變了模式,以「關」,但這並沒有在這IIS8現場環境中工作,也許我錯過了需要奧德被更新的東西r爲IIS正確執行此操作還是defaultRedirect="~/Error">應該也被刪除? 但將行 Response.TrySkipIisCustomErrors = true; 添加到JsonModelErrorResult代碼已停止此內容/ html錯誤,並返回「Bad Request」行。

+0

不確定,考慮到環境,但你有沒有嘗試過這種Response.Headers.Add('Content-type','text/json'); Response.Headers.Add('Content-type','application/json'); – hex494D49

+1

可能是因爲您在ASP.NET或IIS級別遇到問題,並且您的代碼(至少服務器端)沒問題(這可能會解釋內容類型更改)。 HTTP 400可能由於各種原因返回,例如請求標頭太長,查詢字符串中的特殊字符或HTTP請求的大小太大。我會檢查你正在做的HTTP請求,並檢查服務器上的事件查看器,看看框架是否爲你記錄錯誤。讓我知道你找到了什麼,我對這個很好奇。 –

+0

@JustinHelgerson是的我認爲這可能是IIS相關的,但很難複製。我本地沒有相同版本的IIS,並且服務器具有將HTTP重定向到HTTPS的URL重寫設置。我認爲這可能是自定義錯誤,但我禁用他們來測試它,這仍然發生。我的請求頭的內容長度通常很小,問題總是出現在我得到'text/html'Content-Type'響應頭的地方,這裏是請求有效載荷'{「SegmentId」:230,「CountryIds」的一個例子: [], 「ContainerIds」:[], 「ClosureIds」:[]}'。 – Pricey

回答

5

後,用鼠標右鍵設置Response.StatusCode添加這行代碼:

Response.TrySkipIisCustomErrors = true; 

這告訴IIS不攔截請求,並使用其自己的錯誤頁面。