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

In diesem Tutorial wird die dritte von fünf Aufgaben beschrieben, die zum Erstellen einer einfachen WCF-Anwendung (Windows Communication Foundation) erforderlich sind. Eine Übersicht über die Tutorials finden Sie unter Tutorial: Erste Schritte mit Windows Communication Foundation-Anwendungen.

Die nächste Aufgabe beim Erstellen einer WCF-Anwendung besteht darin, einen WCF-Dienst in einer Konsolenanwendung zu hosten. Ein WCF-Dienst macht einen oder mehrere Endpunkte verfügbar, von denen jeder wiederum einen oder mehrere Dienstvorgänge zur Verfügung stellt. Ein Dienstendpunkt gibt die folgenden Informationen an:

  • Eine Adresse, an der Sie den Dienst finden können.
  • Eine Bindung mit Informationen dazu, wie ein Client mit dem Dienst kommunizieren muss.
  • Ein Vertrag, der die Funktionalität definiert, die der Dienst für seine Clients bereitstellt.

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen und Konfigurieren eines Konsolen-App-Projekts zum Hosten eines WCF-Diensts
  • Hinzufügen von Code zum Hosten des WCF-Diensts
  • Aktualisieren der Konfigurationsdatei
  • Starten des WCF-Diensts und Überprüfen, ob er ausgeführt wird

Erstellen und Konfigurieren eines Konsolen-App-Projekts zum Hosten des Diensts

  1. Erstellen Sie ein Konsolen-App-Projekt in Visual Studio:

    1. Wählen Sie im Menü Datei die Option Öffnen>Projekt/Projektmappe aus, und navigieren Sie zur zuvor erstellten Projektmappe GettingStarted (GettingStarted.sln). Klicken Sie auf Öffnen.

    2. Wählen Sie im Menü Ansicht die Option Projektmappen-Explorer aus.

    3. Wählen Sie im Fenster Projektmappen-Explorer die Projektmappe GettingStarted (oberster Knoten) und dann im Kontextmenü Hinzufügen>Neues Projekt aus.

    4. Wählen Sie im Fenster Neues Projekt hinzufügen auf der linken Seite unter Visual C# oder Visual Basic die Kategorie Windows Desktop aus.

    5. Wählen Sie die Vorlage Konsolen-App (.NET Framework) aus, und geben Sie GetStartedHost unter Name ein. Klicken Sie auf OK.

  2. Fügen Sie im Projekt GettingStartedHost dem Projekt GettingStartedLib einen Verweis hinzu:

    1. Wählen Sie im Fenster Projektmappen-Explorer unter dem Projekt GettingStartedHost den Ordner Verweise und dann im Kontextmenü Verweis hinzufügen aus.

    2. Wählen Sie im Dialogfeld Verweis hinzufügen unter Projekt links im Fenster Projektmappe aus.

    3. Wählen Sie im mittleren Abschnitt des Fensters GettingStartedLib und dann OK aus.

      Durch diese Aktion werden die im Projekt GettingStartedLib definierten Typen für das Projekt GettingStartedHost verfügbar.

  3. Fügen Sie im Projekt GettingStartedHost der Assembly System.ServiceModel einen Verweis hinzu:

    1. Wählen Sie im Fenster Projektmappen-Explorer unter dem Projekt GettingStartedHost den Ordner Verweise und dann im Kontextmenü Verweis hinzufügen aus.

    2. Wählen Sie im Fenster Verweis hinzufügen unter Assemblys auf der linken Seite des Fensters die Option Framework aus.

    3. Wählen Sie System.ServiceModel und dann OK aus.

    4. Speichern Sie die Projektmappe, indem Sie Datei>Alle speichern auswählen.

Hinzufügen von Code zum Hosten des Diensts

Fügen Sie zum Hosten des Diensts Code hinzu, sodass die folgenden Schritte ausgeführt werden:

  1. Erstellen eines URI für die Basisadresse
  2. Erstellen einer Klasseninstanz zum Hosten des Diensts
  3. Erstellen eines Dienstendpunkts
  4. Aktivieren des Metadatenaustauschs
  5. Öffnen des Diensthosts, um auf eingehende Nachrichten zu lauschen

Nehmen Sie die folgenden Änderungen am Code vor:

  1. Öffnen Sie die Datei Program.cs oder Module1.vb im Projekt GettingStartedHost, und ersetzen Sie den Code durch den folgenden Code:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    Informationen zur Funktionsweise dieses Codes finden Sie unter Programmschritte zum Hosten des Diensts.

  2. Aktualisieren der Projekteigenschaften

    1. Wählen Sie im Fenster Projektmappen-Explorer den Ordner GettingStartedHost und anschließend im Kontextmenü Eigenschaften aus.

    2. Wählen Sie auf der Eigenschaftenseite GettingStartedHost die Registerkarte Anwendung aus:

      • Wählen Sie bei C#-Projekten in der Liste Startobjekt den Eintrag GettingStartedHost.Program aus.

      • Wählen Sie bei Visual Basic-Projekten in der Liste Startobjekt den Eintrag Service.Program aus.

    3. Wählen Sie im Menü Datei die Option Alle speichern aus.

Überprüfen, ob der Dienst funktioniert

  1. Erstellen Sie die Projektmappe, und führen Sie anschließend die Konsolenanwendung GettingStartedHost in Visual Studio aus.

    Der Dienst muss mit Administratorberechtigungen ausgeführt werden. Da Sie Visual Studio beim Ausführen von GettingStartedHost in Visual Studio mit Administratorberechtigungen geöffnet haben, wird auch die Anwendung mit Administratorberechtigungen ausgeführt. Alternativ können Sie eine neue Eingabeaufforderung als Administrator öffnen (wählen Sie im Kontextmenü Weitere>Als Administrator ausführen aus) und dort GettingStartedHost.exe ausführen.

  2. Öffnen Sie einen Webbrowser, und navigieren Sie zu der Seite des Diensts unter http://localhost:8000/GettingStarted/.

    Hinweis

    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 jedoch die Berechtigung für HTTP-Namespaces erteilt werden. Weitere Informationen zum Konfigurieren von Namespacereservierungen finden Sie unter Configuring HTTP and HTTPS (Konfigurieren von HTTP und HTTPS).

Programmschritte zum Hosten des Diensts

Die Schritte im Code, den Sie zum Hosten des Diensts hinzugefügt haben, werden wie folgt beschrieben:

  • Schritt 1: Erstellt eine Instanz der Uri-Klasse, die die Basisadresse des Diensts enthält. Eine URL, die eine Basisadresse enthält, weist einen optionalen URI auf, der einen Dienst angibt. Die Basisadresse ist wie folgt formatiert: <transport>://<machine-name or domain><:optional port #>/<optional URI segment>. Die Basisadresse für den Rechnerdienst verwendet den HTTP-Transport, localhost, Port 8000 und das URI-Segment „GettingStarted“.

  • Schritt 2: Erstellt eine Instanz der ServiceHost-Klasse, die zum Hosten des Diensts verwendet wird. Der Konstruktor akzeptiert zwei Parameter: den Typ der Klasse, die den Dienstvertrag implementiert, und die Basisadresse des Diensts.

  • Schritt 3: Erstellt eine neue ServiceEndpoint-Instanz. Ein Dienstendpunkt setzt sich aus einer Adresse, einer Bindung und einem Dienstvertrag zusammen. Der ServiceEndpoint-Konstruktor besteht aus dem Schnittstellentyp des Dienstvertrags, einer Bindung und einer Adresse. Der Dienstvertrag ist ICalculator, den Sie definiert haben und im Diensttyp implementieren. Die Bindung für dieses Beispiel lautet WSHttpBinding. Hierbei handelt es sich um eine integrierte Bindung, mit der Verbindungen mit Endpunkten hergestellt wird, die den WS-*-Spezifikationen entsprechen. Weitere Informationen zu WCF-Bindungen finden Sie unter Übersicht über WCF-Bindungen. Die Adresse wird an die Basisadresse angefügt, um den Endpunkt zu anzugeben. Der Code gibt die Adresse als CalculatorService und die vollqualifizierte Adresse für den Endpunkt als http://localhost:8000/GettingStarted/CalculatorService an.

    Wichtig

    Bei .NET Framework ab Version 4 ist das Hinzufügen eines Dienstendpunkts optional. Wenn Sie bei diesen Versionen den Code oder die Konfiguration nicht hinzufügen, fügt WCF einen Standardendpunkt für jede Kombination aus Basisadresse und Vertrag hinzu, die vom Dienst implementiert wurden. Weitere Informationen zu Standardendpunkten finden Sie unter Angeben einer Endpunktadresse. Weitere Informationen zu Standardendpunkten, Bindungen und Verhaltensweisen finden Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste.

  • Schritt 4: Aktiviert den Metadatenaustausch. Clients verwenden den Metadatenaustausch, um Proxys zum Aufrufen der Dienstvorgänge zu generieren. Zum Aktivieren von Metadatenaustausch erstellen Sie eine ServiceMetadataBehavior-Instanz, legen deren HttpGetEnabled-Eigenschaft auf true fest und fügen das Objekt ServiceMetadataBehavior zur Behaviors-Auflistung der ServiceHost-Instanz hinzu.

  • Schritt 5: Öffnet ServiceHost, um auf eingehende Nachrichten zu lauschen. Die Anwendung wartet, bis Sie die EINGABETASTE drücken. Nachdem die Anwendung ServiceHost instanziiert hat, wird ein try/catch-Block ausgeführt. Weitere Informationen zum sicheren Abfangen von Ausnahmen, die von ServiceHostausgelöst werden, finden Sie unter Freigeben von WCF-Clientressourcen mit „Close“ und „Abort“.

Wichtig

Wenn Sie eine WCF-Dienstbibliothek hinzufügen, hostet Visual Studio sie für Sie, wenn Sie sie durch Starten eines Diensthosts debuggen. Zur Vermeidung von Konflikten können Sie verhindern, dass Visual Studio die WCF-Dienstbibliothek hostet.

  1. Wählen Sie das Projekt GettingStartedLib im Projektmappen-Explorer und anschließend im Kontextmenü Eigenschaften aus.
  2. Wählen Sie WCF-Optionen aus, und deaktivieren Sie die Option WCF-Diensthost beim Debuggen eines anderen Projekts in der gleichen Projektmappe starten.

Nächste Schritte

In diesem Tutorial haben Sie Folgendes gelernt:

  • Erstellen und Konfigurieren eines Konsolen-App-Projekts zum Hosten eines WCF-Diensts
  • Hinzufügen von Code zum Hosten des WCF-Diensts
  • Aktualisieren der Konfigurationsdatei
  • Starten des WCF-Diensts und Überprüfen, ob er ausgeführt wird

Fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie einen WCF-Client erstellen.