2个Ajax请求来自1个调用,1个失败,另一个是CORS

时间:2015-07-29 18:16:52

标签: jquery asp.net ajax asp.net-mvc-5 cors

我正在开发一个支持ASP.NET MVC 5 WEB API的站点,该站点使用CORS来实现两者之间的通信。我的问题是,当我通过API删除时,我会进行一次ajax调用,但会发出两个请求。如下所示,一个是常规请求,另一个是CORS兼容请求,CORS请求显然正在通过,并且它正在删除该项目。然而,我不明白为什么另一个甚至在那里。有任何想法吗?我已经检查了元素上是否有多个事件处理程序以及与此相关的任何问题。所以它肯定只被召唤过一次。

请求1(CORS) - 我实际呼叫的那个

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.5
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: DELETE
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 29 Jul 2015 17:18:09 GMT
Content-Length: 0

请求2(???)

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 29 Jul 2015 17:18:09 GMT
Content-Length: 8167

删除AJAX功能

function deleteItem() {
    console.log(event.target.parentNode.parentNode)
    killParent = event.target.parentNode.parentNode;
    targetID = event.target.id
    confirmDel = confirm("Are you sure you want to delete site #" + targetID + "?");
    if (confirmDel == true) {
         $.ajax({
             type: 'DELETE',
             url: 'http://intranet/APITest/api/sites/' + targetID + '/',
             crossDomain: true,
             success: function() {
                 $("#row" + targetID).remove();
             },
             error: function (error) {
                 alert(error);
             }
         }); 
    } else if(confirmDel == false){
        alert("Site #" + targetID + " was not deleted.")
        return false;
    }
};

1 个答案:

答案 0 :(得分:0)

由于您使用的是DELETE,因此第一个可能是pre-flight OPTIONS request

如果您在浏览器工具中签入了第一种实际使用的HTTP方法,那么您可能会在请求中看到类似OPTIONS http://intranet/APITest/api/sites/123的内容。

当您发起跨域AJAX请求时,浏览器通常会使用其中之一,尤其是在使用非标准方法(例如DELETE)时。

从MDN文档中(在上面的链接中):

  

在CORS中,使用OPTIONS方法发送了预检请求,因此   服务器可以响应是否可以发送请求   这些参数。 Access-Control-Request-Method标头   作为预检请求的一部分通知服务器,当   实际的请求已发送,它将使用POST请求方法发送。   Access-Control-Request-Headers标头通知服务器   发送实际请求时,将与X-PINGOTHER一起发送   和Content-Type自定义标题。服务器现在有机会   确定是否希望根据这些条件接受请求   情况。