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

时间:2012-03-16 20:09:02

标签: jquery asp.net ajax

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

我已经对此进行了一些研究,我发现了this answer另一个问题,其中几乎说明如果两个调用都使用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;
}

2 个答案:

答案 0 :(得分:1)

我认为您的方法无效,因为您在成功活动中致电setTimeout("UpdateProgressBar();", 800);。只有在返回ajax请求时才会触发成功事件。这意味着您只在处理完成时检查进度。

Take a look at this StackOverflow answer

答案 1 :(得分:1)

通过一些研究,我发现了两种解决问题的方法。主要问题是会话相关,但是,我没有明确使用会议,这就是为什么它长期以来一直没有找到。

ASP.NET页面认为即使您不手动使用它们,它们也会默认使用Session。因此,为了让Web方法同时执行,您必须明确告诉WebMethods他们不使用Session这样:

[WebMethod(EnableSession=false)]

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

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

感谢所有人的帮助!