2008-12-03 5 views
3

J'ai un service WCF qui sera hébergé sous IIS. Maintenant, j'ai quelques ressources (Connections) que je crée dans le constructeur du service. J'ai besoin de libérer ces ressources lorsque IIS qui héberge le service se ferme ou réinitialise. Ce ne sont pas les ressources que je vais effacer chaque fois que le client se déconnecte, mais ce sont des ressources à l'échelle de l'application qui ne seront libérées que lorsque le service lui-même ou IIS sera arrêté.Comment créer un écouteur pour les événements WCF ServiceHost lorsque le service est hébergé sous IIS?

J'ai vu un autre message où quelqu'un a mentionné qu'il a créé un écouteur pour capturer les événements de ServiceHost. Quelqu'un peut-il m'aider à trouver comment gérer le ServiceHost et capturer l'événement IIS reset ou IIS shutdown et libérer mes ressources dans le service WCF?

Répondre

3

Eh bien, je suis à court d'idées, mais je pense que this article contient votre réponse dans le chapitre: "Accéder à ServiceHost dans IIS". Il semble que vous ayez besoin de créer votre propre HostFactory, car IIS utilise le HostFactory standard et contrôle pratiquement la création et la destruction des hôtes. En fournissant votre propre HostFactory, vous pouvez ajouter votre propre code pour contrôler l'initialisation et la destruction ...

+0

Correct. Mais gardez à l'esprit que la création d'un ServiceHostFactory personnalisé n'est pas difficile du tout. C'est la plupart du temps. – Cheeso

0

Le but des services WCF et de l'hébergement IIS est de parvenir à l'évolutivité et de faciliter l'hébergement. Bien que vous puissiez vous connecter aux événements exposés par la classe ServiceHostBase (voir here), je recommanderais de ne pas effectuer cette opération et d'analyser si vous avez réellement besoin de ces ressources partagées. Les principales raisons de vous demander de repenser sont les suivantes: les ressources partagées doivent être thread safe (IIS peut traiter plusieurs requêtes simultanément), ce qui crée un goulot d'étranglement pour l'évolutivité de votre application et deuxièmement, il vaut mieux que vos services soient apatrides, et cela inclut (je suppose) l'utilisation de ressources partagées (ou ressources à l'échelle de l'application).

3

Vous pouvez utiliser le modèle IDisposable avec le finaliseur sur la classe qui contient les ressources. Lors du déchargement de AppDomain, tous les objets sont finalisés et si l'objet qui fait référence aux ressources (telles connexions) a un finaliseur, le finaliseur sera appelé et vous pourrez fermer/disposer les ressources à ce point.

Questions connexes