Question

J'ai un service Web ASP.NET qui effectue des tâches lourdes, telles que des opérations sur les fichiers ou la génération de feuilles Excel à partir de plusieurs rapports Crystal. Je ne veux pas être bloqué en appelant ce service Web. Je souhaite donc que l'appel de service Web soit asynchrone. De plus, je souhaite appeler ce service Web à partir d'une page Web et je souhaite un mécanisme qui me permettra de continuer à interroger le serveur afin que je puisse afficher un indicateur de progression à l'écran, comme par exemple le nombre de fichiers ont été traitées. Veuillez noter que je ne veux pas de notification à la fin de l'appel de méthode Web, je veux plutôt un statut de progression en direct. Comment puis-je m'y prendre?

Était-ce utile?

La solution

Écrivez sur le serveur une méthode distincte que vous pouvez interroger en transmettant l'ID du travail planifié et renvoyant une valeur approximative comprise entre 0 et 100 (ou entre 0,0 et 1,0, ou autre) indiquant jusqu'à quel point il se trouve. .

E.g. Dans le style REST, vous pouvez envoyer une requête GET à http://votreserveur.com/app/jobstatus/4133/ , ce qui renverrait un simple '52' sous la forme text / plain . Ensuite, il vous suffit d’interroger cela toutes les (secondes? Deux secondes? Dix secondes?) Pour savoir où en est le projet.

La façon dont vous effectuez la surveillance sur le backend dépend énormément de votre processus et de son fonctionnement.

Autres conseils

Je pense que le service Web XML est lent. Par conséquent, si vous créez plusieurs méthodes et que vous interrogez , la progression sera extrêmement lente et générera une charge énorme sur le serveur. Je ne le ferais pas dans un environnement de production. Je vois les mêmes (mais plus petits) problèmes avec l'interrogation de base de données.

Essayez plutôt les extensions SOAP . Il implémente un modèle événementiel. Voir Ajout d'une barre de progression à votre application client de service Web sur MSDN .

Vous pouvez également utiliser SoapExtensions pour informer votre client du téléchargement / progression du processus. Le serveur peut ensuite envoyer des événements au client. Rien dans le client ne doit être changé si vous ne l'utilisez pas.

Autorise quelque chose comme ceci dans votre client:

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}

Demander à la & initiale; commencer à générer le rapport " appel de service Web créer une tâche dans un groupe de tâches et renvoyer à l'appelant l'ID de la tâche.

Ensuite, fournissez une autre méthode qui renvoie le "pourcentage de résultats terminés". pour un taskId donné.

Indiquez une troisième méthode qui renvoie le résultat réel pour une tâche terminée.

Le moyen le plus simple serait de demander au service Web de mettre à jour un champ d'une base de données avec la progression de l'appel, puis de créer un service Web qui interroge ce champ et renvoie la valeur.

Le service Web doit renvoyer une sorte d’ID de tâche ou d’ID de session. Créez une autre méthode Web pour interroger avec cet ID, qui renvoie les informations nécessaires (% d'achèvement, liste de fichiers, peu importe). Interrogez cette méthode à un certain intervalle depuis le client.

Utilisez une base de données pour stocker les informations de processus. Si vous le faites dans la mémoire du service Web, l’évolutivité de l’environnement de la batterie de serveurs Web sera réduite, car il se peut que la tâche soit exécutée sur un autre serveur que celui que vous êtes. interrogation.

EDIT: Je viens de voir une autre réponse similaire et commenter. Le commentateur a raison: vous pouvez utiliser une table en mémoire pour éviter les opérations de disque, tout en utilisant un serveur de base de données distinct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top