在第一个帖子请求完成之前,不会发送jQuery帖子请求

时间:2012-12-06 16:54:58

标签: c# jquery ajax asynchronous request

我有一个执行时间很长的函数。

 public void updateCampaign()
    {

        context.Session[processId] = "0|Fetching Lead360 Campaign";
        Lead360 objLead360 = new Lead360();
        string campaignXML = objLead360.getCampaigns();

        string todayDate = DateTime.Now.ToString("dd-MMMM-yyyy");
        context.Session[processId] = "1|Creating File  for Lead360 Campaign on " + todayDate;
        string fileName = HttpContext.Current.Server.MapPath("campaigns") + todayDate + ".xml";
        objLead360.createFile(fileName, campaignXML);

        context.Session[processId] = "2|Reading The latest Lead360 Campaign";
        string file = File.ReadAllText(fileName);

        context.Session[processId] = "3|Updating Lead360 Campaign";
        string updateStatus = objLead360.updateCampaign(fileName);
        string[] statusArr = updateStatus.Split('|');
        context.Session[processId] = "99|" + statusArr[0] + " New Inserted , " + statusArr[1] + " Updated , With " + statusArr[2] + " Error , ";
    }

因此,为了跟踪函数的进度,我编写了另一个函数

public void getProgress()
    {
        if (context.Session[processId] == null)
        {
            string json = "{\"error\":true}";
            Response.Write(json);
            Response.End();
        }else{
            string[] status = context.Session[processId].ToString().Split('|');
            if (status[0] == "99") context.Session.Remove(processId);

            string json = "{\"error\":false,\"statuscode\":" + status[0] + ",\"statusmsz\":\"" + status[1] + "\" }";
            Response.Write(json);
            Response.End();  
        }
    }

使用jQuery post request来调用它

reqUrl = "AjaxPages/lead360Campaign.aspx?processid=" + progressID + "&action=updatecampaign";
$.post(reqUrl);
setTimeout(getProgress, 500);

get getProgress是:

function getProgress() {
    reqUrl = "AjaxPages/lead360Campaign.aspx?processid=" + progressID + "&action=getProgress";
    $.post(reqUrl, function (response) {
        var progress = jQuery.parseJSON(response);
        console.log(progress)
        if (progress.error) {
            $("#fetchedCampaign .waitingMsz").html("Some error occured. Please try again later.");
            $("#fetchedCampaign .waitingMsz").css({ "background": "url(common/images/ajax_error.jpg) no-repeat center 6px" });
            return;
        }
        if (progress.statuscode == 99) {
            $("#fetchedCampaign .waitingMsz").html("Update Status :"+ progress.statusmsz );
            $("#fetchedCampaign .waitingMsz").css({ "background": "url(common/images/ajax_loded.jpg) no-repeat center 6px" });
            return;
        }
        $("#fetchedCampaign .waitingMsz").html("Please Wait... " + progress.statusmsz);
        setTimeout(getProgress, 500);
    });
}

但问题是我看不到中间信息。经过长时间的ajax加载消息后,才显示最后一条消息

同样在浏览器控制台上,我只看到第一次请求完成后很长时间,之后第二个请求完成。但应该有getProgress

我已检查过jquery.doc,并说$ post是asynchronous请求。

任何人都可以解释代码或逻辑有什么问题吗?

2 个答案:

答案 0 :(得分:3)

你处于这里讨论的情况:

ASP.net session request queuing

在处理对给定用户会话的请求时,对同一会话的其他请求正在等待。您需要在后台线程中运行long函数,然后让启动它的请求完成。但是,后台线程将无法访问会话,您将需要一种不同的机制来传达其进度。

答案 1 :(得分:1)

根据您提供的信息,我怀疑这不是您的javascript代码是同步的,而是服务器端代码。您可以使用Firebug或Chrome的开发工具来测试这两个AJAX请求的开始和结束时间。如果我是对的,你会看到第二个请求在半秒后开始,但直到第一个请求之后才会完成。

如果是这种情况,可能的原因是:

  • 在Visual Studio中的开发环境中运行,特别是在调试模式下,似乎减少了异步性。开发环境似乎希望一次处理一个请求。
  • 有关会话请求排队的信息,请参阅Igor's answer
  • 您可能拥有显式锁定资源的代码,并导致第二个请求阻塞,直到长时间运行的请求完成。

另一个可能的罪魁祸首是大多数浏览器只允许对特定域的有限数量的并发请求。如果您在任何给定时刻有一些待处理的请求,浏览器可能只是将剩余的请求排队,直到它们返回。