Gewusst wie: Hosten eines WCF-Diensts in einer verwalteten AnwendungHow to: Host a WCF Service in a Managed Application

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 finden Sie unterFor more information aboutOptionen für einen Dienst zum Hosten, finden Sie unter Hostingdienste. 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 finden Sie unterFor more information aboutHosten von Diensten in verwalteten Anwendungen, finden Sie unter Hosten in einer verwalteten Anwendung. 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.

So erstellen Sie einen selbst gehosteten DienstTo create a self-hosted service

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

  2. In der installierte Vorlagen Liste Visual C#-, Windows oder Visual Basic, Windows.In the Installed Templates list, select Visual C#, Windows or Visual Basic, Windows. Je nach Ihrer Visual Studio 2012Visual Studio 2012 Einstellungen, eine oder beide Optionen möglicherweise nicht unter die andere Sprachen Knoten in der installierte Vorlagen Liste.Depending on your Visual Studio 2012Visual Studio 2012 settings, one or both of these may be under the Other Languages node in the Installed Templates list.

  3. Wählen Sie Konsolenanwendung aus der Windows Liste.Select Console Application from the Windows list. Typ SelfHost in der Namen Feld, und klicken Sie auf OK.Type SelfHost in the Name box and click OK.

  4. Mit der rechten Maustaste SelfHost in Projektmappen-Explorer , und wählen Sie Verweis hinzufügen... . Wählen Sie System.ServiceModel aus der .NET Registerkarte, und klicken Sie auf OK.Right-click SelfHost in Solution Explorer and select Add Reference.... Select System.ServiceModel from the .NET tab and click 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.

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

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  6. 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 finden Sie unterFor more information aboutzum Definieren und implementieren eine Dienstschnittstelle finden Sie unter wie: Definieren eines Dienstvertrags und Vorgehensweise: Implementieren eines Dienstvertrags. how to define and implement a service interface, see How to: Define a Service Contract and How to: Implement a Service Contract.

  7. 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")
    
  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(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 finden Sie unterFor more information aboutStandardendpunkte, finden Sie unter vereinfachte Konfiguration und vereinfachte Konfiguration für WCF-Dienste. default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  9. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.Press CTRL+SHIFT+B to build the solution.

So testen Sie den DienstTo test the service

  1. Drücken Sie STRG+F5, um den Dienst auszuführen.Press Ctrl + F5 to run the service.

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

    Tipp

    So öffnen WCF-TestclientÖffnen einer Visual Studio 2012Visual Studio 2012 -Eingabeaufforderung, und führen Sie WcfTestClient.exe.To open WCF Test Client, open a Visual Studio 2012Visual Studio 2012 command prompt 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 Adressfeld, 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. Erscheint nun eine Antwortnachricht die 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

Uri
AppSettings
ConfigurationManager
How to: Host a WCF Service in IIS (Vorgehensweise: Hosten eines WCF-Diensts in IIS)How to: Host a WCF Service in IIS
Selbst gehostete DiensteSelf-Host
Hosting-DiensteHosting Services
Vorgehensweise: Definieren eines DienstvertragsHow to: Define a Service Contract
Vorgehensweise: Implementieren eines WCF-DienstvertragsHow to: Implement a Service Contract
ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)
Verwenden von Bindungen, um Dienste und Clients zu konfigurierenUsing Bindings to Configure Services and Clients
Vom System bereitgestellte BindungenSystem-Provided Bindings