Sdílet prostřednictvím


Postupy: Hostování služby WCF ve spravované aplikaci

Pokud chcete hostovat službu ve spravované aplikaci, vložte kód služby do kódu spravované aplikace, definujte koncový bod pro službu buď imperativním způsobem v kódu, deklarativní prostřednictvím konfigurace, nebo pomocí výchozích koncových bodů a pak vytvořte instanci ServiceHost.

Chcete-li začít přijímat zprávy, zavolejte Open .ServiceHost Tím se vytvoří a otevře naslouchací proces pro službu. Hostování služby tímto způsobem se často označuje jako "samoobslužné hostování", protože spravovaná aplikace provádí hostování samotnou práci. Chcete-li zavřít službu, zavolejte CommunicationObject.CloseServiceHost.

Službu je možné hostovat také ve spravované službě Windows, ve službě Internetová informační služba (IIS) nebo ve službě aktivace procesu systému Windows (WAS). Další informace o možnostech hostování pro službu naleznete v tématu Hostitelské služby.

Hostování služby ve spravované aplikaci je nejflexibilnější možností, protože k nasazení vyžaduje nejmenší infrastrukturu. Další informace o hostování služeb ve spravovaných aplikacích najdete v tématu Hostování ve spravované aplikaci.

Následující postup ukazuje, jak implementovat službu v místním prostředí v konzolové aplikaci.

Vytvoření služby v místním prostředí

  1. Vytvořte novou konzolovou aplikaci:

    1. Otevřete Visual Studio a v nabídce Soubor vyberte Nový>projekt.

    2. V seznamu Nainstalované šablony vyberte Visual C# nebo Visual Basic a pak vyberte Plochu systému Windows.

    3. Vyberte šablonu konzolové aplikace. Zadejte SelfHost do pole Název a pak zvolte OK.

  2. Klikněte pravým tlačítkem na SelfHost v Průzkumník řešení a vyberte Přidat odkaz. Na kartě .NET vyberte System.ServiceModela pak zvolte OK.

    Tip

    Pokud není okno Průzkumník řešení viditelné, vyberte Průzkumník řešení z nabídky Zobrazení.

  3. Poklikáním na Program.cs nebo Module1.vb v Průzkumník řešení ho otevřete v okně kódu, pokud ještě není otevřený. Na začátek souboru přidejte následující příkazy:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Definujte a implementujte kontrakt služby. Tento příklad definuje HelloWorldService zprávu, která vrátí zprávu na základě vstupu do služby.

    [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
    

    Poznámka:

    Další informace o definování a implementaci rozhraní služby naleznete v tématu Postupy: Definování kontraktu služby a postupy: Implementace kontraktu služby.

  5. V horní části Main metody vytvořte instanci Uri třídy se základní adresou služby.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. Vytvořte instanci ServiceHost třídy, která předává Type typ služby a základní adresu Uniform Resource Identifier (URI) do ServiceHost(Type, Uri[])třídy . Povolte publikování metadat a potom zavolejte metodu OpenServiceHost pro inicializaci služby a připravte ji na příjem zpráv.

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

    Poznámka:

    Tento příklad používá výchozí koncové body a pro tuto službu není vyžadován žádný konfigurační soubor. Pokud nejsou nakonfigurované žádné koncové body, modul runtime vytvoří jeden koncový bod pro každou základní adresu pro každý kontrakt služby implementovaný službou. Další informace o výchozích koncových bodech naleznete v tématu Zjednodušená konfigurace a Zjednodušená konfigurace pro služby WCF.

  7. Stisknutím kombinace kláves Ctrl+Shift+B sestavte řešení.

Testování služby

  1. Stisknutím kláves Ctrl+F5 spusťte službu.

  2. Otevřete testovacího klienta WCF.

    Tip

    Pokud chcete otevřít testovacího klienta WCF, otevřete vývojářský příkazový řádek pro Visual Studio a spusťte WcfTestClient.exe.

  3. V nabídce Soubor vyberte Přidat službu.

  4. Zadejte http://localhost:8080/hello do pole adresa a klepněte na tlačítko OK.

    Tip

    Ujistěte se, že je služba spuštěná, nebo jinak tento krok selže. Pokud jste v kódu změnili základní adresu, použijte upravenou základní adresu v tomto kroku.

  5. Poklikejte na SayHello pod uzlem Moje projekty služeb. Zadejte své jméno do sloupce Hodnota v seznamu Žádosti a klikněte na Vyvolat.

    V seznamu odpovědí se zobrazí zpráva odpovědi .

Příklad

Následující příklad vytvoří ServiceHost objekt pro hostování služby typu HelloWorldServicea potom volá metodu Open .ServiceHost Základní adresa je k dispozici v kódu, publikování metadat je povolené a používají se výchozí koncové body.

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

Viz také