Delen via


Procedure: Een WCF-service hosten in een beheerde app

Als u een service in een beheerde toepassing wilt hosten, sluit u de code voor de service in de code van de beheerde toepassing in, definieert u een eindpunt voor de service die imperatief in code staat, declaratief via configuratie of met behulp van standaardeindpunten, en maakt u vervolgens een exemplaar van ServiceHost.

Als u berichten wilt ontvangen, belt u Open op ServiceHost. Hiermee wordt de listener voor de service gemaakt en geopend. Het hosten van een service op deze manier wordt vaak 'selfhosting' genoemd, omdat de beheerde toepassing het hostingwerk zelf uitvoert. Als u de service wilt sluiten, roept u aan CommunicationObject.CloseServiceHost.

Een service kan ook worden gehost in een beheerde Windows-service, in Internet Information Services (IIS) of in Windows Process Activation Service (WAS). Zie Hostingservices voor meer informatie over hostingopties voor een service.

Het hosten van een service in een beheerde toepassing is de meest flexibele optie, omdat hiervoor de minste infrastructuur is vereist om te implementeren. Zie Hosting in een beheerde toepassing voor meer informatie over het hosten van services in beheerde toepassingen.

De volgende procedure laat zien hoe u een zelf-hostende service implementeert in een consoletoepassing.

Een zelf-hostende service maken

  1. Maak een nieuwe consoletoepassing:

    1. Open Visual Studio en selecteer Nieuw>project in het menu Bestand.

    2. Selecteer Visual C# of Visual Basic in de lijst Geïnstalleerde sjablonen en selecteer vervolgens Windows Desktop.

    3. Selecteer de console-app-sjabloon . Typ SelfHost het vak Naam en kies OK.

  2. Klik met de rechtermuisknop op SelfHost in Solution Explorer en selecteer Verwijzing toevoegen. Selecteer System.ServiceModel op het tabblad .NET en kies VERVOLGENS OK.

    Tip

    Als het venster Solution Explorer niet zichtbaar is, selecteert u Solution Explorer in het menu Beeld .

  3. Dubbelklik op Program.cs of Module1.vb in Solution Explorer om deze te openen in het codevenster als deze nog niet is geopend. Voeg de volgende instructies toe boven aan het bestand:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Definieer en implementeer een servicecontract. In dit voorbeeld wordt een HelloWorldService bericht gedefinieerd dat wordt geretourneerd op basis van de invoer voor de 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
    
  5. Maak boven aan de Main methode een exemplaar van de Uri klasse met het basisadres voor de service.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Maak een exemplaar van de ServiceHost klasse, waarbij een Type instantie wordt doorgegeven die het servicetype en de URI (Uniform Resource Identifier) van het basisadres aan de ServiceHost(Type, Uri[])klasse vertegenwoordigt. Schakel het publiceren van metagegevens in en roep vervolgens de Open methode aan voor de ServiceHost service om de service te initialiseren en voor te bereiden op het ontvangen van berichten.

    // 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
    

    Notitie

    In dit voorbeeld worden standaardeindpunten gebruikt en is er geen configuratiebestand vereist voor deze service. Als er geen eindpunten zijn geconfigureerd, maakt de runtime één eindpunt voor elk basisadres voor elk servicecontract dat door de service wordt geïmplementeerd. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten.

  7. Druk op Ctrl+Shift+B om de oplossing te bouwen.

De service testen

  1. Druk op Ctrl+F5 om de service uit te voeren.

  2. Open de WCF-testclient.

    Tip

    Als u de WCF-testclient wilt openen, opent u de opdrachtprompt voor Ontwikkelaars voor Visual Studio en voert u WcfTestClient.exe uit.

  3. Selecteer Service toevoegen in het menu Bestand .

  4. Typ http://localhost:8080/hello in het adresvak en klik op OK.

    Tip

    Zorg ervoor dat de service wordt uitgevoerd of anders mislukt deze stap. Als u het basisadres in de code hebt gewijzigd, gebruikt u het gewijzigde basisadres in deze stap.

  5. Dubbelklik op SayHello onder het knooppunt Mijn serviceprojecten. Typ uw naam in de kolom Waarde in de lijst Met aanvragen en klik op Aanroepen.

    Er wordt een antwoordbericht weergegeven in de lijst Met antwoorden .

Opmerking

In het volgende voorbeeld wordt een ServiceHost object gemaakt voor het hosten van een service van het type HelloWorldServiceen wordt de Open methode vervolgens aangeroepen.ServiceHost Er wordt een basisadres opgegeven in code, het publiceren van metagegevens is ingeschakeld en standaardeindpunten worden gebruikt.

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

Zie ook