Procédure : Héberger un service WCF dans une application managée

Pour héberger un service à l'intérieur d'une application managée, incorporez le code du service à l'intérieur du code de l'application managée, définissez un point de terminaison pour le service soit de manière impérative dans le code, soit de façon déclarative par le biais de la configuration ou à l'aide des points de terminaison par défaut, puis créez une instance de ServiceHost.

Pour commencer à recevoir des messages, appelez OpenServiceHost. De cette manière, vous créez et ouvrez l'écouteur pour le service. L'hébergement d'un service selon cette méthode est souvent appelé « auto-hébergement » parce que l'application managée effectue le travail d'hébergement elle-même. Pour fermer le service, appelez CommunicationObject.Close sur ServiceHost.

Un service peut également être hébergé dans un service Windows managé, dans le service IIS (Internet Information Services), ou le service WAS (Windows Process Activation Service). Pour plus d’informations sur les options d’hébergement d’un service, consultez Services d’hébergement.

L'hébergement d'un service dans une application managée constitue l'option d'hébergement la plus flexible parce qu'il requiert le déploiement de moins d'infrastructure. Pour plus d’informations sur l’hébergement de services dans les applications managées, consultez Hébergement dans une application managée.

La procédure suivante montre comment implémenter un service auto-hébergé dans une application console.

Créer un service auto-hébergé

  1. Créez une application console :

    1. Ouvrez Visual Studio et sélectionnez Nouveau>Projet dans le menu Fichier.

    2. Dans la liste Modèles installés, sélectionnez Visual C# ou Visual Basic, puis sélectionnez Windows Desktop.

    3. Sélectionnez le modèle Application console. Entrez SelfHost dans la zone Nom, puis sélectionnez OK.

  2. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur SelfHost et sélectionnez Ajouter une référence. Sous l’onglet .NET, sélectionnez System.ServiceModel, puis OK.

    Conseil

    Si la fenêtre Explorateur de solutions n’est pas visible, sélectionnez Explorateur de solutions dans le menu Affichage.

  3. Double-cliquez sur Program.cs ou Module1.vb dans l’Explorateur de solutions pour l’ouvrir dans la fenêtre de code, si ce n’est pas encore le cas. En tête du fichier, ajoutez les instructions suivantes :

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Définissez et implémentez un contrat de service. Cet exemple définit un HelloWorldService qui retourne un message basé sur l'entrée au service.

    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    

    Notes

    Pour plus d’informations sur la définition et l’implémentation d’une interface de service, consultez Procédure : Définir un contrat de service et Procédure : Implémenter un contrat de service.

  5. En tête de la méthode Main, créez une instance de la classe Uri avec l'adresse de base du service.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Créez une instance de la classe ServiceHost, en passant un Type qui représente le type de service et l'URI d'adresse de base (Uniform Resource Identifier) à ServiceHost(Type, Uri[]). Activez la publication des métadonnées, puis appelez la méthode Open sur ServiceHost pour initialiser le service et le préparer à recevoir des messages.

    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    

    Notes

    Cet exemple utilise les points de terminaison par défaut et aucun fichier de configuration n'est requis pour ce service. Si aucun point de terminaison n'est configuré, le runtime en crée un pour chaque adresse de base pour chaque contrat de service implémenté par le service. Pour plus d’informations sur les points de terminaison par défaut, consultez Configuration simplifiée et Configuration simplifiée pour les services WCF.

  7. Appuyez sur Ctrl+Maj+B pour générer la solution.

Testez le service

  1. Appuyez sur Ctrl+F5 pour exécuter le service.

  2. Ouvrez Client test WCF.

    Conseil

    Pour ouvrir Client test WCF, ouvrez l’invite de commandes développeur pour Visual Studio et exécutez WcfTestClient.exe.

  3. Dans le menu Fichier, sélectionnez Ajouter un service.

  4. Entrez http://localhost:8080/hello dans la zone d’adresse et cliquez sur OK.

    Conseil

    Assurez-vous que le service est en cours d'exécution, sinon cette étape échouera. Si vous avez changé l'adresse de base dans le code, utilisez cette adresse modifiée dans cette étape.

  5. Double-cliquez sur SayHello sous le nœud Mes projets de service. Entrez votre nom dans la colonne Valeur de la liste dans la liste Requête, puis cliquez sur Appeler.

    Un message de réponse apparaît dans la liste Réponse.

Exemple

L'exemple suivant crée un objet ServiceHost pour héberger un service de type HelloWorldService, puis appelle la méthode Open sur ServiceHost. Une adresse de base est fournie dans le code, la publication des métadonnées est activée et les points de terminaison par défaut sont utilisés.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface

    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module

Voir aussi