Tutoriel WCF Partie 3

microsoft

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.

Wcf_Pres_Image11

Visual studio génère le projet suivant:

Wcf_Pres_Image12

  • 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:
 using System.ServiceModel;
using System.ServiceProcess;
using WCFExampleLibrary.WCFServices;

namespace WindowsServiceWCFHosting
{
    public partial class Service : ServiceBase
    {
        private ServiceHost host;
        public Service()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            host = new ServiceHost(typeof (SchoolWcfServices));
              host.Open();
               
        }

        protected override void OnStop()
        {
            host.Close();
        }
    }
}

 

  • 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
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicTextBinding" messageEncoding="Text" textEncoding="utf-8">
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="WCFExampleLibrary.WCFServices.SchoolWcfServices">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicTextBinding" contract="WCFExampleLibrary.WCFServices.ISchoolWcfServices">
         </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8755/WCFExampleLibrary.WCFServices/SchoolWcfServices/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
  • 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.

Wcf_Pres_Image13

Visual Studio crée les deux éléments suivants :

Wcf_Pres_Image14

  • 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 :
  • @echo off
    c:
    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
    installutil.exe -i "D:\ASPMVC\WCFExampleSolution\WindowsServiceWCFHosting\bin\Debug\WindowsServiceWCFHosting.exe"
    
    if ERRORLEVEL 1 goto error
    Timeout /t 30 >nul
    exit
    :error
    echo  l'instalation est terminé en erreur
    pause
  • Le lancement du script génère le résultat suivant :

Wcf_Pres_Image15

Et notre service est bien créé :

Wcf_Pres_Image16

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.

Wcf_Pres_Image17

Le deuxième onglet sert à changer le compte utilisé par le service :

Wcf_Pres_Image18

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.

Wcf_Pres_Image19

  • 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

Wcf_Pres_Image20

  • Je lance mon outil de test Wcf : et j’ajoute la nouvelle adresse avec le port 8755

Wcf_Pres_Image23

 

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 :

Wcf_Pres_Image21

Pour résoudre ça il suffit de modifier les autorisations pour l’utilisateur AUTORITE NT\Système

Et ajouter le rôle sysadmin :

Wcf_Pres_Image22

Le résultat de mon test est le suivant :

Wcf_Pres_Image24

Dans l'article suivant , je parlerai de l’hébergement du service WCF dans IIS.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.