2016-03-02 139 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请求还是实际请求? –