2010-12-09 17 views
0

Je rencontre un problème avec un appel asynchrone au serveur qui ne fonctionne qu'une seule fois, puis il semble devenir un appel synchrone. Laissez-moi essayer d'expliquer.Ajax.BeginForm passe d'asynchrone à synchrone

C'est un site MVC 2.0, utilisant ASP.NET et Ajax. J'utilise l'aide Ajax.BeginForm, comme ceci:

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

Ensuite, pendant que la machine commence je veux rappeler au serveur et obtenir une mise à jour chaque seconde. Cela fonctionne correctement la première fois, puis change de comportement. OnStartingVm ressemble à quelque chose comme ceci:

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); 
      } 
     }, 
    }); 
} 

Dans la fonction updateStartingStatus, la première partie passe à chaque seconde, chaque fois. Cependant, dans l'appel Ajax, le résultat du succès ne fonctionne que toutes les secondes la première fois. Ensuite, la deuxième fois que je clique sur le bouton de démarrage, toutes les demandes sont mises en file d'attente. Une fois le démarrage terminé, environ 20 secondes plus tard, je reçois un tas de fenêtres d'alerte dos à dos. Donc, je peux dire que updateStartingStatus s'exécute chaque seconde à chaque fois, mais l'appel ajax semble changer pour devenir un appel de synchronisation après la première fois.

L'actualisation de la fenêtre du navigateur n'aide pas. Je dois le fermer complètement et l'ouvrir à nouveau. La même chose se produit dans IE et Chrome.

Encore une chose à noter est que div divisée (VirtualMachineForm) contient la plupart de la page, y compris le bouton sur lequel vous appuyez. Donc, il remplace fondamentalement la page de sous lui-même. Je ne sais pas si cela causerait des problèmes.

En outre, si je débogue dans Visual Studio 2010, l'appel n'est pas effectué à l'action du contrôleur lorsque le problème se produit. Donc, il semble que ce soit quelque chose de côté client. J'ai exclu tout problème côté serveur. Pourquoi n'appelez-vous pas la fonction clearInterval?

Répondre

1

Je l'ai finalement compris. This post conduire à la réponse.

Il s'agissait d'un état de session et le navigateur a verrouillé la requête jusqu'à la fin de la précédente. Je n'ai pas besoin de désactiver l'état de la session, mais j'ai dû éviter une écriture de session à partir du code. Cela explique pourquoi une actualisation du navigateur n'a pas fonctionné et pourquoi j'ai dû fermer et ouvrir à nouveau le navigateur.

0

Pourquoi?

+0

Je l'ai déjà là mais je ne l'ai pas montré après avoir coupé mon exemple de code. Je viens d'éditer mon post pour l'inclure. –