Gewusst wie: Hosten und Ausführen eines grundlegenden Windows Communication Foundation-Diensts

Dies ist die dritte von sechs Aufgaben, die zum Erstellen eines grundlegenden Windows Communication Foundation (WCF)-Diensts und eines Clients, der den Dienst aufrufen kann, erforderlich sind. Eine Übersicht über alle sechs Aufgaben finden Sie im Thema Lernprogramm "Erste Schritte".

In diesem Thema wird beschrieben, wie ein grundlegender Windows Communication Foundation (WCF)-Dienst ausgeführt wird. Dieses Verfahren umfasst die folgenden Schritte:

  • Erstellen einer Basisadresse für den Dienst

  • Erstellen eines Diensthosts für den Dienst

  • Aktivieren des Metadatenaustauschs

  • Öffnen des Diensthosts

Eine vollständige Liste des für diese Aufgabe geschriebenen Codes wird in einem Beispiel im Anschluss an das Verfahren bereitgestellt. Fügen Sie den folgenden Code in die Main()-Methode ein, die in der Program-Klasse definiert wird. Diese Klasse wurde beim Erstellen der Service-Projektmappe generiert.

So konfigurieren Sie eine Basisadresse für den Dienst

  1. Erstellen Sie eine Uri-Instanz für die Basisadresse des Diensts. Dieser URI gibt das HTTP-Schema, Ihren lokalen Computer, Anschlussnummer 8000 und den Pfad ServiceModelSample/Service zu dem Dienst an, der für den Namespace des Diensts im Dienstvertrag festgelegt wurde.

    Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
    
    Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
    

So hosten Sie den Dienst

  1. Importieren Sie den System.ServiceModel.Description-Namespace. Diese Codezeile muss zusammen mit dem Rest der using- oder imports-Anweisungen am Anfang der Datei "Program.cs"/"Program.vb" platziert werden.

    Imports System.ServiceModel.Description
    
    using System.ServiceModel.Description;
    
  2. Erstellen Sie eine neue ServiceHost-Instanz, die als Host für den Dienst fungieren soll. Sie müssen den Typ angeben, der den Dienstvertrag und die Basisadresse implementiert. In diesem Beispiel wird die Basisadresse https://localhost:8000/ServiceModelSamples/Service verwendet. CalculatorService ist der Typ, der den Dienstvertrag implementiert.

    Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
    
    ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
  3. Fügen Sie eine try-catch-Anweisung ein, die eine CommunicationException abfängt, und fügen Sie in den try-Block den Code der nächsten drei Schritte ein. Durch die catch-Klausel sollte eine Fehlermeldung angezeigt und anschließend selfHost.Abort() aufgerufen werden.

    Try
        ' ...
    Catch ce As CommunicationException
        Console.WriteLine("An exception occurred: {0}", ce.Message)
        selfHost.Abort()
    End Try
    
    try
    {
        // ...
    }
    catch (CommunicationException ce)
    {
        Console.WriteLine("An exception occurred: {0}", ce.Message);
        selfHost.Abort();
    }
    
  4. Fügen Sie einen Endpunkt hinzu, der den Dienst verfügbar macht. Dazu müssen Sie den Vertrag, den der Endpunkt verfügbar macht, eine Bindung und die Adresse für den Endpunkt angeben. Geben Sie in diesem Beispiel ICalculator als Vertrag, WSHttpBinding als Bindung und CalculatorService als Adresse an. Beachten Sie hierbei, dass die Endpunktadresse eine relative Adresse ist. Die vollständige Adresse des Endpunkts besteht aus der Basisadresse und der Endpunktadresse. In diesem Fall lautet die vollständige Adresse https://localhost:8000/ServiceModelSamples/Service/CalculatorService.

    ' Add a service endpoint
    selfHost.AddServiceEndpoint( _
        GetType(ICalculator), _
        New WSHttpBinding(), _
        "CalculatorService")
    
    selfHost.AddServiceEndpoint(
        typeof(ICalculator),
        new WSHttpBinding(),
        "CalculatorService");
    
    ms730935.note(de-de,VS.100).gifHinweis:
    Ab .NET Framework 4 werden von der Runtime beim Öffnen des ServiceHost standardmäßig Endpunkte hinzugefügt, wenn für den Dienst keine Endpunkte explizit konfiguriert wurden. In diesem Beispiel wird ein Endpunkt explizit hinzugefügt, um die Vorgehensweise zu veranschaulichen. Weitere Informationen über zu Standardendpunkten, -bindungen und -verhalten erhalten Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste.

  5. Aktivieren Sie den Metadatenaustausch. Fügen Sie zu diesem Zweck ein Dienstmetadatenverhalten hinzu. Erstellen Sie zunächst eine ServiceMetadataBehavior-Instanz, legen Sie die HttpGetEnabled-Eigenschaft auf true fest, und fügen Sie dem Dienst anschließend das neue Verhalten hinzu. Weitere Informationen über zu Sicherheitsproblemen beim Veröffentlichen von Metadaten finden Sie unter Security Considerations with Metadata.

    ' Enable metadata exchange
    Dim smb As New ServiceMetadataBehavior()
    smb.HttpGetEnabled = True
    selfHost.Description.Behaviors.Add(smb)
    
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    selfHost.Description.Behaviors.Add(smb);
    
  6. Öffnen Sie den ServiceHost, und warten Sie eingehende Nachrichten. Schließen Sie den ServiceHost, wenn der Benutzer die Eingabetaste drückt.

    selfHost.Open()
    Console.WriteLine("The service is ready.")
    Console.WriteLine("Press <ENTER> to terminate service.")
    Console.WriteLine()
    Console.ReadLine()
    
    ' Close the ServiceHostBase to shutdown the service.
    selfHost.Close()
    
    selfHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();
    
    // Close the ServiceHostBase to shutdown the service.
    selfHost.Close();
    

So überprüfen Sie, ob der Dienst funktioniert

  1. Führen Sie "service.exe" innerhalb von Visual Studio aus. Wird der Dienst unter Windows Vista ausgeführt, muss der Dienst über Administratorrechte verfügen. Da Visual Studio mit Administratorrechten ausgeführt wurde, wird auch "service.exe" mit Administratorrechten ausgeführt. Sie können auch eine neue Eingabeaufforderung mit Administratorrechten starten und "service.exe" damit ausführen.

  2. Öffnen Sie Internet Explorer, und navigieren Sie unter "https://localhost:8000/ServiceModelSamples/Service" zur Debuggingseite des Diensts.

Beispiel

Das folgende Beispiel enthält den Dienstvertrag und die Implementierung aus den vorangegangenen Schritten im Lernprogramm und hostet den Dienst in einer Konsolenanwendung. Kompilieren Sie folgenden Code in eine ausführbare Datei mit dem Namen Service.exe.

Vergessen Sie nicht, beim Kompilieren des Codes auf System.ServiceModel.dll zu verweisen.

Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Service
    ' Define a service contract.
    <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
    Public Interface ICalculator
        <OperationContract()> _
        Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    End Interface

    ' Service class that implements the service contract.
    ' Added code to write output to the console window.
    Public Class CalculatorService
        Implements ICalculator
        Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
            Dim result As Double = n1 + n2
            Console.WriteLine("Received Add({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
            Dim result As Double = n1 - n2
            Console.WriteLine("Received Subtract({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
            Dim result As Double = n1 * n2
            Console.WriteLine("Received Multiply({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
            Dim result As Double = n1 / n2
            Console.WriteLine("Received Divide({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function
    End Class

    Class Program
        Shared Sub Main()
            ' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")

            ' Step 2 of the hosting procedure: Create ServiceHost
            Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
            Try

                ' Step 3 of the hosting procedure: Add a service endpoint.
                ' Add a service endpoint
                selfHost.AddServiceEndpoint( _
                    GetType(ICalculator), _
                    New WSHttpBinding(), _
                    "CalculatorService")

                ' Step 4 of the hosting procedure: Enable metadata exchange.
                ' Enable metadata exchange
                Dim smb As New ServiceMetadataBehavior()
                smb.HttpGetEnabled = True
                selfHost.Description.Behaviors.Add(smb)

                ' Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open()
                Console.WriteLine("The service is ready.")
                Console.WriteLine("Press <ENTER> to terminate service.")
                Console.WriteLine()
                Console.ReadLine()

                ' Close the ServiceHostBase to shutdown the service.
                selfHost.Close()
            Catch ce As CommunicationException
                Console.WriteLine("An exception occurred: {0}", ce.Message)
                selfHost.Abort()
            End Try
        End Sub
    End Class
using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
{
    // Define a service contract.
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

    // Service class that implements the service contract.
    // Added code to write output to the console window.
    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            // Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");

            // Step 2 of the hosting procedure: Create ServiceHost
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            {


                // Step 3 of the hosting procedure: Add a service endpoint.
                selfHost.AddServiceEndpoint(
                    typeof(ICalculator),
                    new WSHttpBinding(),
                    "CalculatorService");


                // Step 4 of the hosting procedure: Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                // Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }

        }
    }
}
ms730935.note(de-de,VS.100).gifHinweis:
Dienste wie dieser müssen dazu berechtigt sein, HTTP-Adressen auf dem Computer zum Überwachen zu registrieren. Administratorkonten verfügen über diese Berechtigung, anderen Konten muss diese Berechtigung für HTTP-Namespaces gewährt werden. Weitere Informationen über dazu, wie Namespacereservierungen konfiguriert werden, finden Sie unter Konfigurieren von HTTP und HTTPS. Wird der Dienst unter Visual Studio ausgeführt, muss "service.exe" über Administratorrechte verfügen.

Der Dienst wird nun ausgeführt. Fahren Sie mit Gewusst wie: Erstellen eines Windows Communication Foundation-Clients fort. Informationen zur Problembehandlung finden Sie unter Problembehandlung für das Lernprogramm "Erste Schritte".

Siehe auch

Aufgaben

Beispiel 'Erste Schritte'
Selbst gehostete Dienste