2010-04-04 4 views
1

Vous vous demandez simplement s'il est possible d'obtenir le statut d'une demande d'une autre demande?ASP.net MVC - Vérifier la demande d'état

Pour aider à fournir un contexte, je veux utiliser ajax pour télécharger certains fichiers sur le serveur. Lorsque le téléchargement est démarré, je veux déclencher une autre requête ajax qui vérifie la quantité de fichier téléchargée (en d'autres termes, quelle est la taille de l'autre requête et jusqu'à quel point le serveur reçoit la requête).

Je pensais que je pourrais utiliser un guid ou quelque chose de similaire pour m'assurer que je vérifie l'état de la bonne demande. Mais comment puis-je vérifier le statut d'une autre demande ???

Vive Anthony

Répondre

0

Vous aurez probablement envie de regarder dans implementing Asynchronous requests in ASP.NET MVC, ou quelque chose de similaire.

+0

Je ne pense pas que ce soit juste parce que le temps pris dans le téléchargement n'est pas le traitement des données une fois que les données sont arrivées sur le serveur, c'est l'envoi des données au serveur. Autant que je sache, cela arrive bien avant que la logique des demandes asynchrones ASP.NET MVC puisse être utilisée. – vdhant

1

C'est certainement possible. Il n'y a pas de support intégré pour vérifier l'état d'une autre requête dans ASP.NET MVC autant que je sache, mais ce n'est pas difficile à implémenter.

public static UploadStatusHelper { 
    static Dictionary<string, int> uploads = new Dictionary<string, int>(); 
    static object lockObj = new object(); 

    public static void SetStatus(string key, int bytesComplete) { 
     lock(lockObj) { 
      uploads[key] = bytesComplete; 
     } 
    } 

    public static void GetStatus(string key) { 
     lock(lockObj) { 
      int bytesComplete = 0; 
      if(uploads.TryGetValue(key, out bytesComplete) { 
       return bytesComplete; 
      } 
      return 0; 
     } 
    } 
} 

Lorsque vous avez lu un morceau du fichier téléchargé sur le serveur, vous appelleriez

UploadStatusHelper.SetStatus(theKey, bytesRead); 

Ensuite, en utilisant en utilisant Ajax, vous pouvez lancer une requête HTTP POST périodiquement à une action qui renvoie la progrès, par exemple

[HttpPost] 
public ActionResult GetProgress(string key) 
    int bytesRead = UploadStatusHelper.GetStatus(key); 
    return Json(new { bytesRead = bytesRead }); 
} 

Vous auriez probablement envie d'étendre cette aide pour stocker la longueur totale du fichier et retourner un pourcentage complet, mais cela est tout simplement pour but de vous montrer comment cela pourrait se faire.

+0

Quand vous dites "Quand vous avez lu un morceau du fichier téléchargé sur le serveur, vous appelleriez" vous dites que cela irait dans l'action ??? Si tel est le cas, autant que je sache, l'action n'est appelée que lorsque toutes les données sont reçues. Par conséquent, où serait l'appel SetStatus être placé? – vdhant

+0

Je me demandais si vous aviez des idées là-dessus? – vdhant

+0

Oui, vous avez absolument raison - une action normale ne sera exécutée qu'une fois toutes les données reçues. Peut-être que vous pourriez utiliser un AsyncController pour contourner cela, même si je n'ai pas essayé cela. Je suis allé avec un IHttpHandler personnalisé moi-même. De toute façon, vous aurez besoin de trouver ou d'écrire du code pour analyser les données de formulaire en plusieurs parties en morceaux et définir l'état de téléchargement, et il y a aussi tout le javascript. PITA! Avez-vous vu cette question pour quelques alternatives possibles? http://stackoverflow.com/questions/977995/how-can-i-upload-a-file-via-asp-net-mvc-and-show-a-progress-bar –

Questions connexes