1 votes

Comment faire en sorte qu'une seule instance d'un service Web soit utilisée pour tous les clients ?

J'ai un service web qui exécute une tâche qui peut prendre des heures pour se terminer (de manière asynchrone).

Je voudrais partager le statut de cette tâche avec tous les clients qui se connectent au serveur (j'utilise une application web pour cela).

Par exemple, le premier client qui appelle la page http://localhost/process.aspx instancie le service web et appelle une méthode pour commencer à exécuter la tâche. Un pourcentage sera affiché pour indiquer l'état d'avancement de la tâche. Je peux faire cela en interrogeant le service web en utilisant AJAX.

Si un autre client tente d'ouvrir cette page, il devrait obtenir les mêmes informations de pourcentage afin qu'aucune nouvelle instance du service web ne soit créée.

Quelle est la meilleure façon de procéder ? J'ai réfléchi à différentes solutions, mais tôt ou tard, je découvre de nouveaux problèmes. Voici quelques-unes des solutions possibles :

  • Créer un objet statique du service Web.
  • Créer l'objet dans le fichier global.asax.

Vous avez d'autres idées ? Je n'ai pas l'habitude de concevoir des sites web et cela me rend fou. J'apprécierais si vous pouviez me fournir des extraits de code.

Merci

0voto

Aaron Anodide Points 6375

Le problème est de s'assurer que les informations relatives à l'instance unique d'un processus sont stockées à un seul endroit.

Votre raisonnement initial peut être appliqué, par exemple, en utilisant l'objet Application, mais cela ne fonctionnera pas dans un scénario IIS en grappe.

Je ne pense pas qu'une base de données soit la meilleure solution absolue, mais je crois qu'elle vous donnerait ce que vous voulez.

Si 100 clients essaient de lancer le processus en même temps, un seul peut réussir, non ? La fonction de verrouillage des bases de données vous aidera à y parvenir.

0voto

Richard B Points 1106

Il y a une méthode (je suppose WCF pour le service web) qui vous permet d'avoir exactement une instance du service exécuté... enlace

Je pense que c'est ce que vous essayez d'accomplir.

0voto

Maxim Gershkovich Points 8244

En supposant que j'ai bien compris vos exigences. Votre webservice ne devrait pas créer l'instance de l'objet "worker".

Votre demande de service Web devrait être enregistrée soit dans une base de données (comme l'autre affiche l'a noté), soit dans une file de messages de quelque sorte. À ce stade, votre processeur "travailleur" (probablement un type de service) devrait prendre en charge le travail selon ses besoins.

En gros, vous voulez décomposer votre application en quelque chose comme ceci

| Webservice | ---------- | Datastore |-----------| Worker |

Toute autre demande concernant le lot doit être gérée par le service Web qui interroge le centre de données.

N'oubliez pas que les services Web ne sont pas conçus pour faire du travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X