$ .ajax调用asmx Web Service(在同一站点中)可以在IE上运行但在FF和Chrome中失败

时间:2011-12-20 13:12:30

标签: jquery asp.net ajax asmx

首先,我不相信我的问题与this重复。调用页面和asmx Web服务位于同一网站中,处于相同的层次结构级别,并且页面具有访问asmx文件的权限。

现在,问我的问题。

我有一个我正在开发的网站,它针对SQL Server执行一些长时间运行的进程。我已经确定标准的ajaxloader.gif不足以满足我的需求,因为任务可能花费不同的时间(15秒到5分钟以上)。

因此,我开发了一个由2个Web服务组成的系统来处理向用户显示的实际进度。第一个Web服务完成工作,更新Service类中的共享变量。第二个Web服务每半秒左右调用一次(有时我将其间隔设置为低至100毫秒)并从共享变量中读取进度值。

现在,这个系统在IE上运行得很漂亮(我正在使用IE9),但似乎在FF和Chrome中完全失败(在Windows和OS X上)。在OS X上的Safari也失败了。

我已经尝试开始学习在非IE浏览器中进行调试,但我在那里苦苦挣扎(这可能就是为什么我无法解决这个问题)。我在JavaScript / jQuery代码中设置断点,但它们永远不会被触发。我在我的JS / jQuery代码中设置了“调试器”区域,那些停止IE,但不要停止FF和Chrome(我认为似乎是“正确”的行为)。所以,我在我的服务代码隐藏文件中设置了断点,它们似乎在3中被触发了大约1次。因此,它并没有完全失败,但它确实失败了很多。正如我所提到的,它在IE上根本没有失败。我已经尝试在FireFox(Windows)上的FireBug中调试它,但我无法从错误代码中获取有用的信息。据我所知,我只是用ErrorText =“error”回复错误。 (没用!)

这是我的jQuery代码:

function LongRunningProcess() {
    debugger;
    $('#progressBar').show();
    $('#progressLabel').show();
    var b = $('#<%= startDateTextBox.ClientID %>').datepicker("getDate");
    var e = $('#<%= endDateTextBox.ClientID %>').datepicker("getDate");
    var bString = (b.getMonth() + 1) + '/' + b.getDate() + '/' + b.getFullYear();
    var eString = (e.getMonth() + 1) + '/' + e.getDate() + '/' + e.getFullYear();
    var params = '{beginningDateString:"' + bString + '", endingDateString:"' + eString + '"}';
    $.ajax({
        type: "POST",
        url: "Service.asmx/LongRunningProcess",
        data: params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: Returned,
        error: ShowError
    });
    GetProgress();
}
function GetProgress() {
    $.ajax({
        type: "POST",
        url: "Service.asmx/ShowProgress",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: ProgressReturned,
        error: ShowError
    });
}
function Returned(missing) {
    // This code isn't important/doesn't affect my question,
    // but it does exist and catch the return in IE
}
function ProgressReturned(progress) {
    $('#progressBar').progressbar("option", "value", progress.d.Progress);
    $('#progressLabel').html(progress.d.Step + ' (' + progress.d.Progress.toFixed(2) + '%)');
    if (progress.d.Progress < 100) {
        setTimeout(GetProgress, 100);
    } else {
        $('#progressBar').progressbar("option", "value", 0);
        $('#progressLabel').html('Done.');
        $('#progressBar').hide();
        $('#progressLabel').hide();
    }
}
function ShowError(request, error) {
    debugger;
    alert(error);
}

我是ASP.NET网络编程的新手,也是JavaScript和jQuery的新手,但我试图做好研究并弄清楚这些东西是如何工作的。另外,就像我说的,上面的代码在IE9中运行得非常漂亮(完全符合我的要求)。此外,在非IE浏览器上,很少触发/满足在“Service.asmx / LongRunningProcess”第一行上设置的断点。所以,我不认为代码错误在我的VB.NET代码中,这就是为什么我没有发布它。我有语法错误或其他什么吗?

1 个答案:

答案 0 :(得分:0)

据我所知,这只是“回归虚假”;我失踪了。