Vorgehensweise: Hosten eines WCF-Diensts in einer verwalteten appHow to: Host a WCF service in a managed app

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.To host a service inside a managed application, embed the code for the service inside the managed application code, define an endpoint for the service either imperatively in code, declaratively through configuration, or using default endpoints, and then create an instance of ServiceHost.

Rufen Sie die Open-Methode der ServiceHost-Instanz auf, um den Empfang von Nachrichten zu starten.To start receiving messages, call Open on ServiceHost. Damit wird ein Listener für den Dienst erstellt und geöffnetThis creates and opens the listener for the service. 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.Hosting a service in this way is often referred to as "self-hosting" because the managed application is doing the hosting work itself. Um den Dienst zu schließen, rufen Sie die CommunicationObject.Close-Methode der ServiceHost-Instanz auf.To close the service, call CommunicationObject.Close on ServiceHost.

Ein Dienst kann auch in einem verwalteten Windows-Dienst in Internetinformationsdienste (IIS) oder in Windows Process Activation Service (WAS) gehostet werden.A service can also be hosted in a managed Windows service, in Internet Information Services (IIS), or in Windows Process Activation Service (WAS). Weitere Informationen zu den Hostoptionen für einen Dienst, finden Sie unter Hostingdienste.For more information about hosting options for a service, see Hosting Services.

Dienste in einer verwalteten Anwendung zu hosten ist die flexibelste Option, da sie für die Bereitstellung die geringsten Anforderungen an die Infrastruktur stellt.Hosting a service in a managed application is the most flexible option because it requires the least infrastructure to deploy. Weitere Informationen zum Hosten von Diensten in verwalteten Anwendungen finden Sie unter Hosten in einer verwalteten Anwendung.For more information about hosting services in managed applications, see Hosting in a Managed Application.

Im folgenden Verfahren wird das Implementieren eines selbst gehosteten Diensts in einer Konsolenanwendung veranschaulicht.The following procedure demonstrates how to implement a self-hosted service in a console application.

Erstellen Sie einen selbst gehosteten DienstCreate a self-hosted service

  1. Erstellen Sie eine neue Konsolenanwendung:Create a new console application:

    1. Öffnen Sie Visual Studio, und wählen Sie neu > Projekt aus der Datei Menü.Open Visual Studio and select New > Project from the File menu.

    2. In der installierte Vorlagen Liste Visual C#- oder Visual Basic, und wählen Sie dann Windows Desktop.In the Installed Templates list, select Visual C# or Visual Basic, and then select Windows Desktop.

    3. Wählen Sie die Konsolen-App Vorlage.Select the Console App template. Typ SelfHost in die Namen Feld, und wählen Sie dann OK.Type SelfHost in the Name box and then choose OK.

  2. Mit der rechten Maustaste SelfHost in Projektmappen-Explorer , und wählen Sie Verweis hinzufügen.Right-click SelfHost in Solution Explorer and select Add Reference. Wählen Sie System.ServiceModel aus der .NET Registerkarte, und wählen Sie dann OK.Select System.ServiceModel from the .NET tab and then choose OK.

    Tipp

    Wenn die Projektmappen-Explorer Fenster ist nicht sichtbar ist, wählen Projektmappen-Explorer aus der Ansicht Menü.If the Solution Explorer window is not visible, select Solution Explorer from the View menu.

  3. Doppelklicken Sie auf "Program.cs" oder "Module1.vb" in Projektmappen-Explorer , die sie im Codefenster zu öffnen, wenn es nicht bereits geöffnet ist.Double-click Program.cs or Module1.vb in Solution Explorer to open it in the code window, if it's not already open. Fügen Sie die folgenden Anweisungen am Anfang der Datei hinzu:Add the following statements at the top of the file:

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. Definieren und implementieren Sie einen Dienstvertrag.Define and implement a service contract. In diesem Beispiel wird ein HelloWorldService-Element definiert, das auf Grundlage der Eingabe in den Dienst eine Nachricht zurückgibt.This example defines a HelloWorldService that returns a message based on the input to the 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
    

    Hinweis

    Weitere Informationen zum Definieren und Implementieren einer Dienstschnittstelle finden Sie unter Vorgehensweise: Definieren eines Dienstvertrags und Vorgehensweise: Implementieren ein Dienstvertrags.For more information about how to define and implement a service interface, see How to: Define a Service Contract and How to: Implement a Service Contract.

  5. Erstellen Sie am Beginn der Main-Methode eine Instanz der Uri-Klasse mit der Basisadresse des Diensts.At the top of the Main method, create an instance of the Uri class with the base address for the service.

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. 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(Type, Uri[]) übergeben.Create an instance of the ServiceHost class, passing a Type that represents the service type and the base address Uniform Resource Identifier (URI) to the ServiceHost(Type, Uri[]). 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.Enable metadata publishing, and then call the Open method on the ServiceHost to initialize the service and prepare it to receive messages.

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

    Hinweis

    In diesem Beispiel werden Standardendpunkte verwendet. Für diesen Dienst ist keine Konfigurationsdatei erforderlich.This example uses default endpoints, and no configuration file is required for this service. Wenn keine Endpunkte konfiguriert sind, wird von der Laufzeit ein Standardendpunkt für alle Basisadressen in jedem Dienstvertrag hinzugefügt, der vom Dienst implementiert wird.If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. Weitere Informationen zu Standardendpunkten, finden Sie unter Simplified Configuration und Simplified Configuration for WCF Services.For more information about default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  7. Drücken Sie STRG+UMSCHALT+B zum Erstellen der Projektmappe.Press Ctrl+Shift+B to build the solution.

Testen des DienstsTest the service

  1. Drücken Sie STRG+F5 zum Ausführen des Diensts.Press Ctrl+F5 to run the service.

  2. Open WCF-Testclient.Open WCF Test Client.

    Tipp

    Zum Öffnen WCF-Testclient, öffnen Sie die Developer-Eingabeaufforderung für Visual Studio, und führen Sie WcfTestClient.exe.To open WCF Test Client, open Developer Command Prompt for Visual Studio and execute WcfTestClient.exe.

  3. Wählen Sie Dienst hinzufügen aus der Datei Menü.Select Add Service from the File menu.

  4. Typ http://localhost:8080/hello in das Feld Adresse ein, und klicken Sie auf OK.Type http://localhost:8080/hello into the address box and click OK.

    Tipp

    Stellen Sie sicher, dass der Dienst ausgeführt wird, oder ein Fehler tritt bei diesem Schritt auf.Make sure the service is running or else this step fails. Haben Sie die Basisadresse im Code geändert, verwenden Sie in diesem Schritt die geänderte Basisadresse.If you have changed the base address in the code, then use the modified base address in this step.

  5. Doppelklicken Sie auf SayHello unter der Meine Dienstprojekte Knoten.Double-click SayHello under the My Service Projects node. Geben Sie Ihren Namen in der Wert -Spalte in der anfordern aus, und klicken Sie auf Invoke.Type your name into the Value column in the Request list, and click Invoke.

    Eine Reply-Nachricht wird angezeigt, der Antwort Liste.A reply message appears in the Response list.

BeispielExample

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.The following example creates a ServiceHost object to host a service of type HelloWorldService, and then calls the Open method on ServiceHost. Im Code wird eine Basisadresse bereitgestellt, die Metadatenveröffentlichung ist aktiviert, und Standardendpunkte werden verwendet.A base address is provided in code, metadata publishing is enabled, and default endpoints are used.

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

Siehe auchSee also