丢失的连接不会在实时站点上使用jQuery AJAX返回错误但在dev上?

时间:2010-11-16 00:23:41

标签: asp.net jquery ajax

我使用以下代码将数据从asp.net 2.0站点发布到将数据发布到服务器的asp.net 2.0 Web服务:

$.ajax({
    type: "POST",
    url: "SynchroniseCustomers.asmx/synchroniseCustomers",
    data: JSON.stringify(customerObj),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (xhr, status) {
        // If not successfull
    },
    success: function (msg) {
        deleteCustomer(customer.id);
    }
});

我有一个JavaScript函数来检查我是否有连接,如果我运行同步(从Web工具包浏览器本地数据库中提取数据):

function checkConnection() {
    var i = new Image();
    i.onload = synchronise;
    i.onerror = fail;
    i.src = 'http://myurl.com/ping.gif?d=' + escape(Date());
    setTimeout("checkConnection()", 60000); // Execute every minute
}

事情是,如果我在本地运行并删除我的互联网连接,Web服务将返回500错误(就像我希望它做的那样)和deleteCustomer(customer.id);不叫。但是,在实际站点上,如果我断开连接,Web服务不会返回错误并且deleteCustomer(customer.id);即使我没有连接到互联网也会被调用(客户从本地数据库中删除而不被发布到Web服务器)。

这是什么原因?如果您需要更多代码,请与我们联系。

提前致谢。

2 个答案:

答案 0 :(得分:0)

在断开连接后你可能没等一分钟。

答案 1 :(得分:0)

有一种情况是,当您要求删除时,Ajax会调用缓存的数据,即使您没有连接到网络,它也会从缓存中获取,这就是为什么它认为这一切都没问题。默认情况下,jQuery Ajax上的缓存为true。

请尝试使用 cache:false

$.ajax({
    type: "POST",
    url: "SynchroniseCustomers.asmx/synchroniseCustomers",
    data: JSON.stringify(customerObj),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache:false,

    error: function (xhr, status) {
        // If not successfull
    },
    success: function (msg) {
        deleteCustomer(customer.id);
    }
});

对于图像调用,最好使用Interval而不是一次又一次地创建内存。

<img id="PingerImg" width="1" height="1" src="/spacer.gif?" onload="synchronise" onerror="fail" /> 

<script language="javascript" type="text/javascript">
    var myImg = document.getElementById("PingerImg");

    if (myImg){
        window.setInterval(function(){myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());}, 60000);
    }   
</script>

更新

另一个解决方案是从您删除用户的服务器中获取确认代码,并且只有在您阅读该代码后,才能继续删除远程用户。

    success: function (msg) {
        if(msg.confirm = true)
        {
         deleteCustomer(customer.id);
        }
        else
        {
         alert('Fail to delete user.');
        }
    }