Dela via


Anvisningar: Vara värd för en WCF-tjänst i en hanterad app

Om du vill vara värd för en tjänst i ett hanterat program bäddar du in koden för tjänsten i den hanterade programkoden, definierar en slutpunkt för tjänsten antingen imperativt i kod, deklarativt via konfiguration eller använder standardslutpunkter och skapar sedan en instans av ServiceHost.

Om du vill börja ta emot meddelanden anropar du OpenServiceHost. Detta skapar och öppnar lyssnaren för tjänsten. Att vara värd för en tjänst på det här sättet kallas ofta "självvärd" eftersom det hanterade programmet gör själva värdarbetet. Om du vill stänga tjänsten anropar du CommunicationObject.CloseServiceHost.

En tjänst kan också finnas i en hanterad Windows-tjänst, i Internet Information Services (IIS) eller i Windows Process Activation Service (WAS). Mer information om värdalternativ för en tjänst finns i Värdtjänster.

Att vara värd för en tjänst i ett hanterat program är det mest flexibla alternativet eftersom det kräver minst infrastruktur för distribution. Mer information om att vara värd för tjänster i hanterade program finns i Hosting in a Managed Application (Värd i ett hanterat program).

Följande procedur visar hur du implementerar en lokalt installerad tjänst i ett konsolprogram.

Skapa en lokalt installerad tjänst

  1. Skapa ett nytt konsolprogram:

    1. Öppna Visual Studio och välj Nytt>projektArkiv-menyn.

    2. I listan Installerade mallar väljer du Visual C# eller Visual Basic och sedan Windows Desktop.

    3. Välj mallen Konsolapp . Skriv SelfHost i rutan Namn och välj sedan OK.

  2. Högerklicka på SelfHost i Solution Explorer och välj Lägg till referens. Välj System.ServiceModelfliken .NET och välj sedan OK.

    Dricks

    Om Solution Explorer-fönstret inte visas väljer du Solution Explorermenyn Visa .

  3. Dubbelklicka på Program.cs eller Module1.vb i Solution Explorer för att öppna det i kodfönstret, om det inte redan är öppet. Lägg till följande instruktioner överst i filen:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Definiera och implementera ett tjänstkontrakt. Det här exemplet definierar en HelloWorldService som returnerar ett meddelande baserat på indata till tjänsten.

    [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
    

    Kommentar

    Mer information om hur du definierar och implementerar ett tjänstgränssnitt finns i Så här definierar du ett tjänstkontrakt och Hur du: Implementera ett tjänstkontrakt.

  5. Överst i Main metoden skapar du en instans av Uri klassen med basadressen för tjänsten.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Skapa en instans av ServiceHost klassen och skicka en Type som representerar tjänsttypen och basadressen Uniform Resource Identifier (URI) till ServiceHost(Type, Uri[]). Aktivera metadatapublicering och anropa Open sedan metoden på ServiceHost för att initiera tjänsten och förbereda den för att ta emot meddelanden.

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

    Kommentar

    I det här exemplet används standardslutpunkter och ingen konfigurationsfil krävs för den här tjänsten. Om inga slutpunkter har konfigurerats skapar körningen en slutpunkt för varje basadress för varje tjänstkontrakt som implementeras av tjänsten. Mer information om standardslutpunkter finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.

  7. Tryck på Ctrl+Skift+B för att skapa lösningen.

Testa tjänsten

  1. Tryck på Ctrl+F5 för att köra tjänsten.

  2. Öppna WCF-testklienten.

    Dricks

    Öppna WCF-testklienten genom att öppna Kommandotolken för utvecklare för Visual Studio och köra WcfTestClient.exe.

  3. Välj Lägg till tjänstArkiv-menyn .

  4. Skriv http://localhost:8080/hello i adressrutan och klicka på OK.

    Dricks

    Kontrollera att tjänsten körs, annars misslyckas det här steget. Om du har ändrat basadressen i koden använder du den ändrade basadressen i det här steget.

  5. Dubbelklicka på SayHello under noden Mina tjänstprojekt . Skriv ditt namn i kolumnen Värde i listan Begäran och klicka på Anropa.

    Ett svarsmeddelande visas i svarslistan.

Exempel

I följande exempel skapas ett ServiceHost objekt som ska vara värd för en tjänst av typen HelloWorldServiceoch anropar sedan metoden på OpenServiceHost. En basadress anges i kod, metadatapublicering aktiveras och standardslutpunkter används.

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

Se även