Tutoriel : Héberger et exécuter un service Windows Communication Foundation (WCF) de base

Ce tutoriel décrit la troisième des cinq tâches requises pour créer une application Windows Communication Foundation (WCF) de base. Pour obtenir une vue d’ensemble des tutoriels, consultez Tutoriel : Prise en main des applications Windows Communication Foundation.

La tâche suivante pour créer une application WCF consiste à héberger un service WCF dans une application console. Un service WCF expose un ou plusieurs points de terminaison, exposant chacun une ou plusieurs opérations de service. Un point de terminaison de service spécifie les informations suivantes :

  • Une adresse où trouver le service.
  • Une liaison contenant les informations décrivant comment un client doit communiquer avec le service.
  • Un contrat définissant la fonctionnalité que le service fournit à ses clients.

Dans ce tutoriel, vous allez apprendre à :

  • Créer et configurer un projet d’application console pour héberger un service WCF.
  • Ajouter du code pour héberger le service WCF.
  • Mettre à jour le fichier de configuration.
  • Démarrer le service WCF et vérifier qu’il fonctionne.

Créer et configurer un projet d’application console pour héberger un service WCF

  1. Créez un projet d’application console dans Visual Studio :

    1. Dans le menu Fichier, sélectionnez Ouvrir>Projet/solution, puis accédez à la solution GettingStarted que vous avez créée précédemment (GettingStarted.sln). Sélectionnez Ouvrir.

    2. Dans le menu Affichage, sélectionnez Explorateur de solutions.

    3. Dans la fenêtre Explorateur de solutions, sélectionnez la solution GettingStarted (nœud supérieur), puis, dans le menu contextuel, sélectionnez Ajouter>Nouveau projet.

    4. Dans la fenêtre Ajouter un nouveau projet, sur le côté gauche, sous Visual C# ou Visual Basic, sélectionnez la catégorie Bureau Windows.

    5. Sélectionnez le modèle Application console (.NET Framework), puis, pour le Nom, entrez GettingStartedHost. Sélectionnez OK.

  2. Ajoutez dans le projet GettingStartedHost une référence au projet GettingStartedLib :

    1. Dans la fenêtre Explorateur de solutions, sous le projet GettingStartedHost, sélectionnez le dossier Références, puis, dans le menu contextuel, sélectionnez Ajouter une référence.

    2. Dans la boîte de dialogue Ajouter une référence, sous Projets sur le côté gauche de la fenêtre, sélectionnez Solution.

    3. Dans la section centrale de la fenêtre, sélectionnez GettingStartedLib, puis OK.

      Cette action rend les types définis dans le projet GettingStartedLib disponibles pour le projet GettingStartedHost.

  3. Ajoutez dans le projet GettingStartedHost une référence à l’assembly System.ServiceModel :

    1. Dans la fenêtre Explorateur de solutions, sous le projet GettingStartedHost, sélectionnez le dossier Références, puis, dans le menu contextuel, sélectionnez Ajouter une référence.

    2. Dans la fenêtre Ajouter une référence, sous Assemblys sur le côté gauche de la fenêtre, sélectionnez Infrastructure.

    3. Sélectionnez System.ServiceModel, puis OK.

    4. Enregistrez la solution en sélectionnant Fichier>Enregistrer tout.

Ajouter du code pour héberger le service WCF

Pour héberger le service, vous ajoutez du code accomplissant les étapes suivantes :

  1. Créer un URI pour l’adresse de base.
  2. Créer une instance de classe pour l’hébergement du service.
  3. Créer un point de terminaison de service.
  4. Activer l'échange de métadonnées.
  5. Ouvrir l’hôte de service pour écouter les messages entrants.

Apportez les modifications suivantes au code :

  1. Ouvrez le fichier Program.cs ou Module1.vb dans le projet GettingStartedHost, puis remplacez son code par le code suivant :

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    Pour plus d’informations sur le fonctionnement de ce code, consultez Étapes du programme d’hébergement de service.

  2. Mettez à jour les propriétés du projet :

    1. Dans la fenêtre Explorateur de solutions, sélectionnez le dossier GettingStartedHost, puis, dans le menu contextuel, sélectionnez Propriétés.

    2. Dans la page des propriétés du projet GettingStartedHost, sélectionnez l’onglet Application :

      • Pour des projets en C#, dans la liste Objet de démarrage, sélectionnez GettingStartedHost.Program.

      • Pour des projets en Visual Basic, dans la liste Objet de démarrage, sélectionnez Service.Program.

    3. Dans le menu Fichier, sélectionnez Enregistrer tout.

Vérifier que le service fonctionne

  1. Générez la solution, puis, à partir de Visual Studio, exécutez l’application console GettingStartedHost.

    Le service doit être exécuté avec des privilèges d’administrateur. Étant donné que vous avez ouvert Visual Studio avec des privilèges d’administrateur, lorsque vous exécutez GettingStartedHost dans Visual Studio, l’application est également exécutée avec des privilèges d’administrateur. Vous pouvez également ouvrir une nouvelle invite de commandes en tant qu’administrateur (dans le menu contextuel, sélectionner Plus>Exécuter en tant qu’administrateur), puis exécuter GettingStartedHost.exe dans celle-ci.

  2. Ouvrez un navigateur web et accédez à la page du service à l’adresse http://localhost:8000/GettingStarted/.

    Notes

    Des services tels que celui-ci doivent disposer de l’autorisation appropriée pour inscrire des adresses HTTP sur la machine afin de les écouter. Les comptes Administrateur possèdent cette autorisation, mais l'autorisation pour les espaces de noms HTTP doit être accordée aux comptes qui ne sont pas administrateur. Pour plus d’informations sur la configuration des réservations d’espaces de noms, consultez Configuration de HTTP et HTTPS.

Étapes du programme d’hébergement de service

Les étapes du code que vous avez ajouté pour héberger le service sont décrites comme suit :

  • Étape 1 : Créer une instance de la classe Uri pour contenir l’adresse de base du service. Une URL contenant une adresse de base a un URI facultatif identifiant un service. L’adresse de base est mise en forme comme suit : <transport>://<machine-name or domain><:optional port #>/<optional URI segment>. L’adresse de base du service de calculatrice utilise le transport HTTP, le localhost, le port 8000 et le segment d’URI GettingStarted.

  • Étape 2 : Créer une instance de la classe ServiceHost pour héberger le service. Le constructeur prend deux paramètres : le type de la classe implémentant le contrat de service et l’adresse de base du service.

  • Étape 3 : Créer une instance de ServiceEndpoint. Un point de terminaison de service est composé d'une adresse, d'une liaison et d'un contrat de service. Le constructeur ServiceEndpoint se compose du type d’interface de contrat de service, d’une liaison et d’une adresse. Le contrat de service est ICalculator, que vous définissez et implémentez dans le type de service. La liaison utilisée pour cet exemple est WSHttpBinding, c’est-à-dire une liaison intégrée qui se connecte à des points de terminaison conformes aux spécifications WS-*. Pour plus d’informations sur les liaisons WCF, consultez Vue d’ensemble des liaisons WCF. Vous ajoutez l’adresse à l’adresse de base pour identifier le point de terminaison. Le code spécifie l’adresse en tant que CalculatorService, et l’adresse complète du point de terminaison en tant que http://localhost:8000/GettingStarted/CalculatorService.

    Important

    Pour .NET Framework versions 4 et ultérieures, l’ajout d’un point de terminaison de service est facultatif. Dans ces versions, si vous n’ajoutez pas de code ou de configuration, WCF ajoute un point de terminaison par défaut pour chaque combinaison d’adresse de base et de contrat implémentée par le service. Pour plus d’informations sur les points de terminaison par défaut, consultez Spécification d’une adresse de point de terminaison. Pour plus d’informations sur les points de terminaison, les liaisons et les comportements par défaut, consultez Configuration simplifiée et Configuration simplifiée pour les services WCF.

  • Étape 4 : Activer l’échange de métadonnées. Les clients utilisent un échange de métadonnées afin de générer des proxys pour appeler les opérations de service. Pour permettre l’échange de métadonnées, créez une instance ServiceMetadataBehavior, définissez sa propriété HttpGetEnabled sur true, puis ajoutez l’objet ServiceMetadataBehavior à la collection Behaviors de l’instance ServiceHost.

  • Étape 5 : Ouvrir ServiceHost pour écouter les messages entrants. L’application attend que vous appuyiez sur Entrée. Après avoir instancié ServiceHost, l’application exécute un bloc try/catch. Pour plus d’informations sur l’interception sécurisée des exceptions levées par ServiceHost, consultez Utiliser Fermer et abandonner pour libérer les ressources du client WCF.

Important

Lorsque vous ajoutez une bibliothèque de service WCF, Visual Studio l’héberge pour vous si vous la déboguez en démarrant un hôte de service. Pour éviter les conflits, vous pouvez empêcher Visual Studio d’héberger la bibliothèque de service WCF.

  1. Dans l’Explorateur de solutions, sélectionnez le projet GettingStartedLib, puis, dans le menu contextuel, choisissez Propriétés.
  2. Sélectionnez Options WCF, puis désactivez l’option Démarrer l’hôte de service WCF lors du débogage d’un autre projet dans la même solution.

Étapes suivantes

Dans ce didacticiel, vous avez appris à :

  • Créer et configurer un projet d’application console pour héberger un service WCF.
  • Ajouter du code pour héberger le service WCF.
  • Mettre à jour le fichier de configuration.
  • Démarrer le service WCF et vérifier qu’il fonctionne.

Passez au tutoriel suivant pour découvrir comment créer un client WCF.