2016-03-02 137 views
1

我正面臨奇怪的問題。我正在實施一項SPA。我正在使用MVC,Sammy路由器,在這裏需要JS和Knockout。

這裏是一個文件,我定義了函數來調用API。

define(['jquery', 'UIBlock'], function ($) { 
    var GlobalParameters = function() { 
     this.Parameters; 
     this.APIEndPoint = 'http://localhost:24774/API/'; 
    }; 

    GlobalParameters.prototype.AjaxCallToServer = function (url, requestType, data, successCallback) { 
     $.blockUI(); 
     $.ajax({ 
      url: this.APIEndPoint + url, 
      data: data, 
      contentType: "application/json", 
      type: requestType, 
      statusCode: { 
       500: function() { 
        $('#info').html('<p>An error has occurred while processing your request.</p>'); 
        $('#info').show(); 
       }, 
       409: function (xhr, ajaxOptions, thrownError) { 
        var message = JSON.parse(xhr.responseText).ExceptionMessage; 
        $('#info').html(message); 
        $('#info').show(); 
       }, 
       204: function (data) { 
        $('#info').html('<p>No data found.</p>'); 
        $('#info').show(); 
       } 
      }, 
      dataType: 'json', 
      success: successCallback, 
      complete: function() { 
       $.unblockUI(); 
       setTimeout(function() { 
        $('#info').hide(); 
        $('#info').html(""); 
       }, 3000); 
      } 
     }); 
    }; 

    return { 
     GlobalParameters: GlobalParameters 
    } 
}); 

我添加了調試器,發現它只被調用一次。

以下是來自Google Chrome開發者工具的網絡跟蹤。 enter image description here

以下是每個請求的詳細信息。

enter image description here enter image description here

回答

1

這是正常的行爲,它被稱爲預檢請求。與簡單請求「預檢」請求首先發送HTTP OPTIONS請求標頭到其他域的資源,以確定實際請求是否安全發送

有關更多詳細信息,請參閱this

+1

感謝Sanjay的回覆,與我的問題是,它的調用成功回調兩次。是否有任何方法可以從響應中識別出預檢反應或實際響應? –

+0

@alok_dida不可能。瀏覽器本身使OPTIONS請求,它與ajax成功無關...只有當它被拒絕,然後它進入ajax錯誤 – charlietfl

+0

@charlietfl ..問題是,如果你看到我的AJAX調用代碼,我有書面代碼專門針對不同的狀態代碼。在我的PUT API調用過程中,我收到了兩個不同的響應。一個是200(預檢請求),另一個是409(實際請求)。由於這個原因,我可以在屏幕上看到兩條消息。有沒有什麼方法可以避免或確定響應是來自Preflight請求還是實際請求? –