Почтовый запрос jQuery не отправляется до тех пор, пока не будет выполнен первый почтовый запрос

У меня есть функция, которая имеет длительное время выполнения.

 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 используется

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

получить 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.

Может кто-нибудь объяснить, что не так с кодом или логикой?


person Champ    schedule 06.12.2012    source источник
comment
Вы используете один и тот же обработчик для обоих? Это асинхронный обработчик?   -  person VoidMain    schedule 06.12.2012
comment
В какой среде вы это запускаете? ИИС? Или в среде разработки?   -  person StriplingWarrior    schedule 06.12.2012
comment
да, это тот же обработчик. но как сделать обработчик асинхронным?   -  person Champ    schedule 06.12.2012


Ответы (2)


Вы находитесь в ситуации, обсуждаемой здесь:

Очередь запросов сеанса ASP.net

Пока обрабатывается запрос для данного сеанса пользователя, ожидаются другие запросы для того же сеанса. Вам нужно запустить свою длинную функцию в фоновом потоке и позволить запросу, который ее инициирует, завершиться. Однако фоновый поток не будет иметь доступа к сеансу, и вам потребуется другой механизм для сообщения о его ходе.

person Igor    schedule 06.12.2012
comment
<%@Page EnableSessionState="false"/> может мне чем-нибудь помочь? если нет, что вы мне предложите сделать? - person Champ; 06.12.2012

Из предоставленной вами информации я подозреваю, что это не ваш код javascript, который является синхронным, а код на стороне сервера. Вы можете проверить это, используя Firebug или инструменты разработчика Chrome, чтобы посмотреть время начала и окончания двух запросов AJAX. Если я прав, вы увидите, что второй запрос начинается через полсекунды, но завершается только после первого.

Если это так, то возможные причины:

  • Запуск в среде разработки в Visual Studio, особенно в режиме отладки, по-видимому, снижает уровень асинхронности. Среда разработки, похоже, любит обрабатывать один запрос за раз.
  • См. ответ Игоря об очереди запросов сеанса.
  • У вас может быть код, который явно блокирует ресурсы и вызывает блокировку второго запроса до тех пор, пока не будет выполнен длительный запрос.

Еще одним возможным виновником является тот факт, что большинство браузеров разрешают только ограниченное количество одновременных запросов к определенному домену. Если у вас есть несколько ожидающих запросов в любой момент, браузер может просто поставить в очередь оставшиеся запросы, пока они не вернутся.

person StriplingWarrior    schedule 06.12.2012
comment
может ли ‹%@Page EnableSessionState=false/› помочь мне каким-либо образом? если нет, что вы мне предложите сделать? - person Champ; 06.12.2012
comment
@Champ: Как и во многих других случаях, ответ таков: это зависит от обстоятельств. Потратьте некоторое время, чтобы рассмотреть последствия блокировки состояния сеанса или запрета доступа к состоянию сеанса. Скорее всего, лучше всего будет разрешить выполнение первоначального запроса, показав, что длительное задание успешно запущено, а затем заставить браузер периодически отправлять новые запросы для проверки состояния. Как только статус будет завершен, сделайте то, что вы сделали бы в противном случае, когда первоначальный запрос был выполнен. - person StriplingWarrior; 06.12.2012
comment
но из-за этого я не могу следить за ходом долгой работы :( - person Champ; 06.12.2012