Ajax.BeginForm从异步切换到同步

时间:2010-12-09 06:56:51

标签: ajax asp.net-mvc asp.net-mvc-2

我遇到的问题是对服务器的异步调用只能运行一次,然后它似乎成为同步调用。让我试着解释一下。

这是一个使用ASP.NET和Ajax的MVC 2.0站点。我正在使用Ajax.BeginForm帮助器,如下所示:

<% using (Ajax.BeginForm("Start", null,
new { virtualMachineId = xyz },
new AjaxOptions { UpdateTargetId = "VirtualMachineForm", OnBegin="OnStartingVm" }
)){

然后在机器启动时我想回到服务器并每秒钟进行一次更新。它第一次正确工作,然后改变行为。 OnStartingVm看起来像这样:

function OnStartingVm() {
    $('#StartingDiv').css('visibility', 'visible');
    $('#StartingDiv').show();
    var vmId = xyz;

    intervalId = setInterval(function () {
        updateStartingStatus(vmId)
    }, 1000);
}
function updateStartingStatus(vmId) {
    /* This part always runs */
    $.ajax({
        url: "/member/vm/getstartingstatus/" + vmId,
        dataType: 'json',
        async: true,
        success: function (data) {
          alert('This part runs every second on the first time only');
           if (data.status == "Running") {
              $('#StartingDiv').text(data.percentComplete);
           }
           else {
              $('#StartingDiv').css('visibility', 'hidden');
              $('#StartingDiv').hide();
              clearInterval(intervalId);
           }
        },
    });
}

在updateStartingStatus函数中,第一部分每秒都会运行一次。但是,在Ajax调用中,成功结果仅在第一次每秒运行一次。然后在第二次点击开始按钮时,所有请求都排队。启动完成后,大约20秒后,我得到一堆警告窗口背靠背。所以,我可以告诉每次updateStartingStatus每秒运行一次,但是ajax调用似乎在第一次之后切换为同步调用。

刷新浏览器窗口没有帮助。我必须完全关闭它并再次打开它。在IE和Chrome中也是如此。

还需要注意的是,更新的div(VirtualMachineForm)包含大部分页面,包括按下的按钮。所以它基本上取代了页面本身。不确定这是否会导致任何问题。

此外,如果我在Visual Studio 2010中进行调试,则在出现问题时不会对控制器操作进行调用。所以,它似乎是客户端的东西。我已经排除了服务器端的任何问题。

2 个答案:

答案 0 :(得分:1)

我最终弄明白了。 This post导致答案。

与会话状态相关,浏览器锁定请求,直到前一个请求完成。我不需要禁用会话状态,但我不得不避免从代码中进行会话写入。

这解释了为什么浏览器刷新不起作用以及为什么我必须再次关闭并打开浏览器。

答案 1 :(得分:0)

为什么不调用clearInterval函数?