L’inconvénient du self-hosting est que le service est indisponible si l’application qui l’héberge n'est pas disponible, comme dans notre projet exemple, le projet console est lancé, le service peut répondre à nos demandes si l'on ferme la console on ferme aussi le service.
D'où l’utilité d'avoir un outil qui pilote le lancement du service WCF , Windows Service peut jouer ce rôle car il permet de garantir le fonctionnement du WCF service tant que la machine sur laquelle il tourne est en marche.
En plus de ça, Windows service offre plusieurs options d’exécution et de reprise en cas d'erreur.
Dans ce qui suit, je vais créer une application Windows services qui va héberger notre WCF Service.
Visual studio génère le projet suivant:
- Je renomme le service en ServiceWCFHosting, puis je clic droit sur la partie design pour voir le code
- J’ajoute l’instance de mon WCF service dans la méthode Onstart, et je le lance via la méthode Open() et quand le service windows s’arrête, je stop aussi mon WCF Service:
- Il faut ajouter les deux références: WCFExampleLibrary , Système.ServiceModel
- Dans le fichier App.config , j’ajoute la configuration de mon WCF service , j’utilise la même que celle du projet console. En changeant juste le port pour le distinguer facilement
- J’ajoute aussi dans le fichier App.config la connexion string pour se connecter à la base SchoolData.
- Il ne faut pas oublier d’ajouter une référence à la dll EntityFrameXWork.SqlServer.dll
- L’étape suivante consiste à créer l’installation du Windows Services, pour cela, dans la partie design du Windows service, clic droit puis ajout d’un installeur.
Visual Studio crée les deux éléments suivants :
- ServiceInstaller1 possède des propriétés comme le type de lancement du Windows Services qui peuvent être automatique, manuel, ou désactivé.
- Je modifie son nom par serviceInstallerForServiceWCFHosting et je modifie la propriété serviceName par ServiceWCFHosting.
- ServiceProcessInstaller1 possède la propriété count qui sert à préciser le compte utilisé par Windows Services, plusieurs choix sont possibles selon le droit de chaque compte, je choisi le compte LocalSystem car c’est un compte puissant qui bénéficie d'un accès complet à l'ordinateur.
- Je modifie le nom ServiceProcessInstaller1 par ServiceProcessInstallerForServiceWCFHosting
- Jusqu’à maintenant j’ai terminé la création du Windows services, il faut ensuite installer ce service via l’outil installutil.exe qui se trouve dans C:\Windows\Microsoft.NET\Framework\v4.0.30319.
- Voici un fichier .bat qui a effectué l’installation :
- Le lancement du script génère le résultat suivant :
Et notre service est bien créé :
Avant d’aller plus loin, décrivons un peu ce qu’offre la fenêtre propriété du Windows service :
Le premier onglet sert à préciser le type de démarrage, et à changer l’état du service.
Le deuxième onglet sert à changer le compte utilisé par le service :
Le troisième onglet sert à préciser le comportement quand le service rencontre des problèmes, plusieurs scénarios sont possibles : redémarrage du service ou de l’ordinateur après trois défaillances, ou redémarrage périodique après un temps précisé en minutes ou en jours.
Il faut cocher le la case activer les actions en cas d’arrêt avec erreur.
- Testons maintenant notre WCF service hébergé par Windows Service , Je démarre le service Windows :
Pour voir l’état et les erreurs du service Windows, il faut lancer l’outil Observateur d’évènement
- Je lance mon outil de test Wcf : et j’ajoute la nouvelle adresse avec le port 8755
Quand j'exécute la première méthode j’ai une erreur « End Point not found », j’ajoute la configuration pour tracer les erreur WCF dans le fichier App.config ( voir l'article précédent pour plus d’informations).
Le fichier app_tracelog m’indique l’erreur suivante :
Pour résoudre ça il suffit de modifier les autorisations pour l’utilisateur AUTORITE NT\Système
Et ajouter le rôle sysadmin :
Le résultat de mon test est le suivant :
Dans l'article suivant , je parlerai de l’hébergement du service WCF dans IIS.