ASP.NET-jQuery ajax调用队列,而不是并发运行



我必须对用户加载的文件进行一些处理。根据文件中的页数,此过程可能需要很长时间。我计划使用jQueryUI的进度条,告诉用户已经处理了多少页面。但是,在第一次ajax调用完成之前,我的进度检查不会返回。正确完成的两个调用都连接到相应的web方法。

我已经对此进行了一点研究,并找到了另一个问题的答案,该问题几乎表明,如果两个调用都使用Session,它们将不会同时处理。不过,我只在其中一个通话中使用会话。

我错过了什么?

这是启动文件处理的初始调用。我将UpdateProgressBar设置为在文件处理开始后运行一秒钟。

setTimeout("UpdateProgressBar();", 1000);
$.ajax({
    type: "POST",
    async: true,
    data: // my params go here
    url: // path to web method
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result) {
         // Do stuff when file is finished processing
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        if (errorThrown != null)
            alert(textStatus + " : " + errorThrown);
    }
});

这是UpdateProgressBar函数:

function UpdateProgressBar() {
    $.ajax({
        type: "POST",
        async: true,
        data: // my params go here
        url: // path to web method
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (result) {
            var totalPages = parseInt($('[id$=lbl_PageCount]').text());
            var pagesProcessed = result.d;
            var percentProcessed = pagesProcessed / totalPages;
            $('#div_ProgressBar').progressbar("value", percentProcessed);
            if (pagesProcessed < totalPages)
                setTimeout("UpdateProgressBar();", 800);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            if (errorThrown != null)
                alert(textStatus + " : " + errorThrown);
        }
    });

编辑

这是UpdateProgressBar调用的WebMethod。另一个WebMethod确实使用Session,但正如您所看到的,这个没有。他们都访问了一个dll,然而,我尝试在不使用dll进行更新的情况下进行测试,结果没有什么不同。

[WebMethod]
public static int CheckPDFProcessingProgress(// params go here)
{
    int pagesProcessed = 1;
    try
    {
        OrderService _orderService = new OrderService();
        pagesProcessed = _orderService.GetMailingPDFPagesProcessedProgress(PersonID);
    }
    catch (Exception ex)
    {
        // log error
    }
    return pagesProcessed;
}

我认为您的方法不会奏效,因为您调用setTimeout("UpdateProgressBar();", 800);是成功事件的一部分。只有当ajax请求返回时,才会触发成功事件。这意味着您只在处理完成后才检查进度。

看看这个StackOverflow的答案。

通过一点研究,我发现了两种解决问题的方法。主要问题是与会话有关,然而,我没有明确使用会话,这就是为什么我这么长时间都没有使用会话的原因。

ASP.NET页面认为它们默认使用会话,即使您没有手动使用它。因此,为了让您的Web方法同时运行,您必须明确地告诉WebMethods,它们不会像这样使用会话:

[WebMethod(EnableSession=false)]

或者,如果你将有许多WebMethod,并将它们全部存储在一个页面上,你可以将页面指令设置为不使用Session,如下所示:

<%@ Page Async="true" EnableSessionState="False" %>

谢谢大家的帮助!

最新更新