Share via


Gewusst wie: Hosten eines WCF-Diensts in einer verwalteten Anwendung

Wenn ein Dienst in einer verwalteten Anwendung gehostet werden soll, betten Sie den Code für den Dienst in den verwalteten Anwendungscode ein, definieren Sie entweder imperativ im Code, deklarativ über die Konfiguration oder mithilfe der Standardendpunkte einen Endpunkt für den Dienst, und erstellen Sie dann eine Instanz von ServiceHost.

Rufen Sie die Open-Methode der ServiceHost-Instanz auf, um den Empfang von Nachrichten zu starten. Damit wird ein Listener für den Dienst erstellt und geöffnet Diese Art des Hostings wird häufig auch als "Selbsthosting" bezeichnet, weil die verwaltete Anwendung selbst die für das Hosting erforderlichen Vorgänge ausführt. Um den Dienst zu schließen, rufen Sie die System.ServiceModel.Channels.CommunicationObject.Close-Methode der ServiceHost-Instanz auf.

Ein Dienst kann auch in einem verwalteten Windows-Dienst in Internet Information Services (IIS) oder in Windows Process Activation Service (WAS) gehostet werden. Weitere Informationen über zu den Hostoptionen für einen Dienst finden Sie unter Hosting-Dienste.

Dienste in einer verwalteten Anwendung zu hosten ist die flexibelste Option, da sie für die Bereitstellung die geringsten Anforderungen an die Infrastruktur stellt. Weitere Informationen über zum Hosting von Diensten in verwalteten Anwendungen finden Sie unter Hosten in einer verwalteten Anwendung.

Im folgenden Verfahren wird das Implementieren eines selbst gehosteten Diensts in einer Konsolenanwendung veranschaulicht.

So erstellen Sie einen selbst gehosteten Dienst

  1. Klicken Sie Visual Studio 2010, und wählen Sie im Menü Datei zunächst Neu und dann Projekt... aus.

  2. Wählen Sie in der Liste Installierte Vorlagen die Option Visual C# und anschließend Windows oder Visual Basic aus. Abhängig von den Visual Studio 2010-Einstellungen befindet sich ggf. eine oder es befinden sich beide Optionen im Knoten Andere Sprachen in der Liste Installierte Vorlagen.

  3. Wählen Sie in der Liste Windows die Option Konsolenanwendung aus. Geben Sie im Feld Name die Bezeichnung SelfHost ein, und klicken Sie auf OK.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf SelfHost, und wählen Sie Verweis hinzufügen aus. Wählen Sie auf der Registerkarte .NET die Option System.ServiceModel aus, und klicken Sie anschließend auf OK.

    ms731758.Tip(de-de,VS.100).gifTipp:
    Wenn das Fenster Projektmappen-Explorer nicht angezeigt wird, wählen Sie im Menü Ansicht die Option Projektmappen-Explorer aus.

  5. Doppelklicken Sie im Fenster von Projektmappen-Explorer auf die Datei Program.cs oder Module1.vb, um sie ggf. im Codefenster zu öffnen. Fügen Sie am Anfang der Datei die folgenden Anweisungen ein.

    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
  6. Definieren und implementieren Sie einen Dienstvertrag. In diesem Beispiel wird ein HelloWorldService-Element definiert, das auf Grundlage der Eingabe in den Dienst eine Nachricht zurückgibt.

    <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(de-de,VS.100).gifHinweis:
    Weitere Informationen über zum Definieren und Implementieren einer Dienstschnittstelle finden Sie unter Gewusst wie: Definieren eines Windows Communication Foundation-Dienstvertrags und Gewusst wie: Implementieren eines Windows Communication Foundation-Dienstvertrags.

  7. Erstellen Sie am Beginn der Main-Methode eine Instanz der Uri-Klasse mit der Basisadresse des Diensts.

    Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")
    
    Uri baseAddress = new Uri("https://localhost:8080/hello");
    
  8. Erstellen Sie eine Instanz der ServiceHost-Klasse, wobei Sie ein Type-Objekt, das den Diensttyp darstellt, und den URI (Uniform Resource Identifier) der Basisadresse ServiceHost übergeben. Aktivieren Sie die Veröffentlichung von Metadaten, und rufen Sie die Open-Methode für das ServiceHost-Objekt auf, um den Dienst zu initialisieren und auf den Empfang von Nachrichten vorzubereiten.

    ' 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(de-de,VS.100).gifHinweis:
    In diesem Beispiel werden Standardendpunkte verwendet. Für diesen Dienst ist keine Konfigurationsdatei erforderlich. Wenn keine Endpunkte konfiguriert sind, wird von der Runtime ein Standardendpunkt für alle Basisadressen in jedem Dienstvertrag hinzugefügt, der vom Dienst implementiert wird. Weitere Informationen über Standardendpunkte finden Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste.

  9. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.

So testen Sie den Dienst

  1. Drücken Sie STRG+F5, um den Dienst auszuführen.

  2. Öffnen Sie den WCF-Testclient.

    ms731758.Tip(de-de,VS.100).gifTipp:
    Zum Starten des WCF-Testclient öffnen Sie die Visual Studio 2010-Eingabeaufforderung und geben WcfTestClient.exe ein.

  3. Wählen Sie im Menü Datei den Befehl Dienst hinzufügen aus.

  4. Geben Sie im Adressfeld die Bezeichnung https://localhost:8080/hello ein, und klicken Sie auf OK.

    ms731758.Tip(de-de,VS.100).gifTipp:
    Stellen Sie sicher, dass der Dienst ausgeführt wird, oder ein Fehler tritt bei diesem Schritt auf. Haben Sie die Basisadresse im Code geändert, verwenden Sie in diesem Schritt die geänderte Basisadresse.

  5. Doppelklicken Sie im Knoten Meine Dienstprojekte auf SayHello. Geben Sie in der Liste Anforderung in der Spalte Wert Ihren Namen ein, und klicken Sie auf Aufrufen. In der Liste Antwort erscheint nun eine Antwortnachricht.

Beispiel

Im folgenden Beispiel wird ein ServiceHost-Objekt als Host für einen Dienst des Typs HelloWorldService erstellt, und dann wird die Open-Methode der ServiceHost-Instanz aufgerufen. Im Code wird eine Basisadresse bereitgestellt, die Metadatenveröffentlichung ist aktiviert, und Standardendpunkte werden verwendet.

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();
            }
        }
    }
}

Siehe auch

Aufgaben

Gewusst wie: Hosten eines WCF-Diensts in IIS
Selbst gehostete Dienste
Gewusst wie: Definieren eines Windows Communication Foundation-Dienstvertrags
Gewusst wie: Implementieren eines Windows Communication Foundation-Dienstvertrags

Verweis

Uri
AppSettings
ConfigurationManager

Konzepte

Hosting-Dienste
ServiceModel Metadata Utility-Tool (Svcutil.exe)
Verwenden von Bindungen, um Dienste und Clients zu konfigurieren
Vom System bereitgestellte Bindungen