2010-12-09 116 views
0

我遇到了一個異步調用到服務器的問題,只有一次工作,然後它似乎成爲一個同步調用。讓我試着解釋一下。Ajax.BeginForm從異步切換到同步

這是一個MVC 2.0網站,使用ASP.NET和Ajax。我使用的是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中進行調試,則在發生問題時不會對控制器操作進行調用。所以,它似乎是客戶端的東西。我排除了服務器端的任何問題。

回答

1

我終於明白了。 This post導致答案。

與會話狀態相關,瀏覽器鎖定請求,直到完成上一個請求。我不需要禁用會話狀態,但我必須避免從代碼寫入會話。

這解釋了爲什麼瀏覽器刷新不起作用,爲什麼我不得不關閉並再次打開瀏覽器。

0

爲什麼不調用clearInterval函數?

+0

我確實在那裏,但我修剪我的代碼示例後沒有顯示它。我剛剛編輯我的文章,以包括它。 – 2010-12-09 16:29:13