Besoin d’un long processus ASP.NET MVC avec commentaires des utilisateurs

J’ai essayé de créer un contrôleur dans mon projet pour fournir des rapports assez complexes. En conséquence, ils peuvent prendre un temps relativement long et une barre de progression aiderait certainement les utilisateurs à savoir que les choses progressent. Le rapport sera lancé via une requête AJAX, l’idée étant que les requêtes JSON périodiques obtiennent le statut et mettent à jour la barre de progression.

J’ai expérimenté avec AsyncController car cela semble être un bon moyen de lancer de longs processus sans lier les ressources, mais cela ne me permet pas de vérifier la progression (et semble bloquer les requêtes JSON et Je n’ai pas encore découvert pourquoi). Après cela, j’ai essayé de stocker les progrès dans une variable statique sur le contrôleur et de lire le statut de celle-ci – mais pour être honnête, tout semble un peu piraté!

Toutes les suggestions acceptées avec reconnaissance!

Voici un exemple que j’ai écrit que vous pourriez essayer:

Manette:

public class HomeController : AsyncController { public ActionResult Index() { return View(); } public void SomeTaskAsync(int id) { AsyncManager.OutstandingOperations.Increment(); Task.Factory.StartNew(taskId => { for (int i = 0; i < 100; i++) { Thread.Sleep(200); HttpContext.Application["task" + taskId] = i; } var result = "result"; AsyncManager.OutstandingOperations.Decrement(); AsyncManager.Parameters["result"] = result; return result; }, id); } public ActionResult SomeTaskCompleted(string result) { return Content(result, "text/plain"); } public ActionResult SomeTaskProgress(int id) { return Json(new { Progress = HttpContext.Application["task" + id] }, JsonRequestBehavior.AllowGet); } } 

Vue:

  

L'idée est de démarrer une opération asynchrone qui signalera la progression à l'aide de HttpContext.Application ce qui signifie que chaque tâche doit avoir un identifiant unique. Ensuite, du côté client, nous démarrons la tâche, puis envoyons plusieurs requêtes AJAX (toutes les 5 secondes) pour mettre à jour la progression. Vous pouvez modifier les parameters pour vous adapter à votre scénario. Une autre amélioration serait d'append la gestion des exceptions.

4,5 ans après avoir répondu à cette question, nous avons une bibliothèque qui peut faciliter cette tâche: SignalR. Pas besoin d’utiliser l’état partagé (ce qui est mauvais car cela peut entraîner des résultats inattendus), utilisez simplement la classe HubContext pour vous connecter à un concentrateur qui envoie des messages au client.

Tout d’abord, nous établissons une connexion SignalR comme d’habitude (voir par exemple ici ), sauf que nous n’avons pas besoin de méthode côté serveur sur notre Hub. Ensuite, nous effectuons un appel AJAX vers notre sharepoint terminaison / contrôleur / peu importe et transmettons l’ID de connexion, que nous obtenons normalement: var connectionId = $.connection.hub.id; . Du côté des serveurs, vous pouvez démarrer votre processus sur un thread différent et rétablir 200 OK sur le client. Le processus connaîtra l’identifiant de connexion afin qu’il puisse renvoyer des messages au client, comme ceci:

 GlobalHost.ConnectionManager.GetHubContext() .Clients.Client(connectionId) .log(message); 

Ici, log est une méthode côté client que vous souhaitez appeler depuis le serveur, il convient donc de la définir comme vous le faites habituellement avec SignalR:

 $.connection.logHub.client.log = function(message){...}; 

Plus de détails dans mon blog ici

Si vous avez un access à votre serveur Web en tant que choix, vous pouvez créer un service Windows ou une application console simple pour effectuer un travail de longue durée. Votre application Web doit append un enregistrement à la firebase database pour indiquer que l’opération doit démarrer, et votre service Windows qui recherche périodiquement de nouveaux enregistrements dans la firebase database doit commencer à exécuter la tâche et signaler la progression vers la firebase database. Votre application Web peut utiliser la requête ajax pour vérifier les progrès et montrer aux utilisateurs.

J’ai utilisé cette méthode pour implémenter des rapports Excel pour l’application asp.net mvc. Ce rapport a été créé par le service Windows qui s’exécute sur la machine et vérifie constamment les nouveaux enregistrements dans la table des rapports. Lorsqu’il trouve un nouvel enregistrement, il commence à créer un rapport et indique une progression en mettant à jour le champ d’enregistrement. L’application Asp.net mvc vient d’append un nouvel enregistrement de rapport et de suivre les progrès dans la firebase database jusqu’à ce qu’elle soit terminée, puis fournit un lien vers un fichier prêt à télécharger.