Partager via


Comment : 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 System.ServiceModel.Channels.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 le sujet suivant les options d'hébergement pour un service, consultez Hébergement de services.

L'hébergement d'un service dans une application managée est l'option la plus souple parce qu'elle requiert le moins d'infrastructure à déployer. Pour plus d'informations sur le sujet suivant les services d'hébergement 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.

Pour créer un service auto-hébergé

  1. Ouvrez Visual Studio 2010 et dans le menu Fichier, sélectionnez Nouveau, puis Projet.

  2. Dans la liste Modèles installés, sélectionnez Visual C#, Windows ou Visual Basic, Windows. Selon les paramètres Visual Studio 2010 que vous avez définis, l'une ou les deux options peuvent figurer sous le nœud Autres langages dans la liste Modèles installés.

  3. Dans la liste Windows, sélectionnez Application console. Dans la zone Nom, tapez SelfHost et cliquez sur OK.

  4. 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 et cliquez sur OK.

    ms731758.Tip(fr-fr,VS.100).gifConseil :
    Si la fenêtre Explorateur de solutions n'est pas visible, dans le menu Affichage, choisissez Explorateur de solutions.

  5. Double-cliquez sur Program.cs ou sur 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 :

    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
  6. 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()>
        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
    
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    ms731758.note(fr-fr,VS.100).gifRemarque :
    Pour plus d'informations sur le sujet suivant la procédure de définition et d'implémentation d'une interface de service, consultez Comment : définir un contrat de service Windows Communication Foundation et Comment : implémenter un contrat de service Windows Communication Foundation.

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

    Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")
    
    Uri baseAddress = new Uri("https://localhost:8080/hello");
    
  8. 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. 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 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
    
    // 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();
    }
    
    ms731758.note(fr-fr,VS.100).gifRemarque :
    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 le sujet suivant les points de terminaison par défaut, consultez Configuration simplifiée et Simplified Configuration for WCF Services.

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

Pour tester le service

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

  2. Ouvrez Client test WCF.

    ms731758.Tip(fr-fr,VS.100).gifConseil :
    Pour ouvrir Client test WCF, ouvrez une invite de commandes Visual Studio 2010 et exécutez WcfTestClient.exe.

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

  4. Tapez https://localhost:8080/hello dans la zone d'adresse et cliquez sur OK.

    ms731758.Tip(fr-fr,VS.100).gifConseil :
    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. Tapez votre nom dans la colonne Valeur 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.

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("https://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
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("https://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();
            }
        }
    }
}

Voir aussi

Tâches

Comment : héberger un service WCF dans IIS
Self-Host
Comment : définir un contrat de service Windows Communication Foundation
Comment : implémenter un contrat de service Windows Communication Foundation

Référence

Uri
AppSettings
ConfigurationManager

Concepts

Hébergement de services
Outil Service Model Metadata Tool (Svcutil.exe)
Utilisation de liaisons pour configurer des services et des clients
Liaisons fournies par le système