Übersicht über die Endpunkterstellung

Die gesamte Kommunikation mit einem Windows Communication Foundation (WCF)-Dienst verläuft über die Endpunkte des Diensts. Endpunkte ermöglichen Clients den Zugriff auf die Funktionalität, die ein WCF-Dienst bereitstellt. In diesem Abschnitt wird die Struktur eines Endpunkts beschrieben und dargestellt, wie ein Endpunkt in einer Konfiguration oder im Code definiert wird.

Die Struktur eines Endpunkts

Jeder Endpunkt beinhaltet eine Adresse, die angibt, wo sich der Endpunkt befindet, eine Bindung, die angibt, wie ein Client mit dem Endpunkt kommunizieren kann und einen Vertrag angibt, der die verfügbaren Methoden identifiziert.

  • Adresse. Die Adresse gewährleistet eine eindeutige Identifizierung des Endpunkts und teilt potenziellen Consumern den Standort des Diensts mit. Die Adresse wird im WCF-Objektmodell durch die EndpointAddress-Adresse dargestellt, die einen Uniform Resource Identifier (URI) und Adresseigenschaften beinhaltet, die wiederum eine Identität, einige Web Services Description Language (WSDL)-Elemente und eine Auflistung der optionalen Header enthalten. Die optionalen Header stellen zusätzliche ausführliche Adressinformationen bereit, um den Endpunkt zu identifizieren oder damit zu interagieren. Weitere Informationen finden Sie unter Angeben einer Endpunktadresse.

  • Bindung. Die Bindung gibt an, wie eine Kommunikation mit dem Endpunkt stattfindet. Die Bindung gibt an, wie der Endpunkt mit der Außenwelt kommuniziert (einschließlich des zu verwendenden Transportprotokolls, beispielsweise TCP oder HTTP), welche Codierung für die Nachrichten zu verwenden ist (beispielsweise Text- oder Binärcodierung) und welche Sicherheitsanforderungen erforderlich sind (beispielsweise Secure Sockets Layer [SSL] oder SOAP-Nachrichtensicherheit). Weitere Informationen finden Sie unter Verwenden von Bindungen, um Dienste und Clients zu konfigurieren.

  • Dienstvertrag. Der Dienstvertrag zeigt, welche Funktionen der Endpunkt dem Client zur Verfügung stellt. In einem Vertrag wird Folgendes angegeben: die Vorgänge, die ein Client aufrufen kann, die Form der Nachricht und der Typ der Eingabeparameter oder die Daten, die zum Aufrufen des Vorgangs erforderlich sind, sowie die Art der Verarbeitung oder die Antwortnachricht, die der Client erwarten kann. Drei grundlegende Vertragstypen entsprechen grundlegenden Nachrichtenaustauschmustern: Datagramm (unidirektional), Anforderung/Antwort und Duplex (bidirektional). Für den Dienstvertrag können zudem Daten- und Nachrichtenverträge verwendet werden, um beim Zugriff bestimmte Datentypen und Nachrichtenformate zu fordern. Weitere Informationen über zum Definieren eines Dienstvertrags finden Sie unter Entwerfen von Dienstverträgen. Ein Client kann ggf. auch dazu aufgefordert werden, einen vom Dienst definierten Vertrag zu implementieren (wird als Rückrufvertrag bezeichnet), um vom Dienst in einem Duplexnachrichten-Austauschmuster Nachrichten zu empfangen. Weitere Informationen finden Sie unter Duplexdienste.

Der Endpunkt für einen Dienst kann entweder verbindlich durch Verwenden von Code oder deklarativ durch Konfiguration angegeben werden. Wenn keine Endpunkte angegeben sind, stellt die Runtime Standardendpunkte bereit, indem ein Standardendpunkt für alle Basisadressen in jedem Dienstvertrag, der vom Dienst implementiert wird, hinzugefügt wird. Die Definition von Endpunkten im Code ist normalerweise nicht geeignet, da die Bindungen und Adressen für einen bereitgestellten Dienst sich in der Regel von denen unterscheiden, die während der Entwicklung des Diensts verwendet werden. Im Allgemeinen ist es praktischer, Dienstendpunkte nicht mit Code, sondern mit Konfiguration zu definieren. Werden die Bindung und die Adressinformationen nicht in den Code integriert, ist eine Änderung ohne Neukompilierung und erneute Bereitstellung der Anwendung möglich.

ms735096.note(de-de,VS.100).gifHinweis:
Beim Hinzufügen eines Dienstendpunkts, der einen Identitätswechsel ausführt, muss entweder eine der AddServiceEndpoint-Methoden oder die GetContract-Methode verwendet werden, um den Vertrag ordnungsgemäß in ein neues ServiceDescription-Objekt zu laden.

Definieren von Endpunkten in Code

Im folgenden Beispiel wird die Angabe eines Endpunkts in Code veranschaulicht:

  • Definieren Sie einen Vertrag für einen IEcho-Diensttypen, der den Namen einer Person akzeptiert und die Antwort "Hello <Name>!" ausgibt.

  • Implementieren Sie einen Echo-Dienst des Typs, der durch den IEcho-Vertrag definiert wird.

  • Geben Sie für den Dienst die Endpunktadresse https://localhost:8000/Echo an.

  • Konfigurieren Sie den Echo-Dienst mithilfe einer WSHttpBinding-Bindung.

Namespace Echo
{
   // Define the contract for the IEcho service 
   [ServiceContract]
   Interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   Class Echo : IEcho
   {
      Public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("https://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho), 
             binding, 
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo 
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("https://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()
ms735096.note(de-de,VS.100).gifHinweis:
Der Diensthost wird mit einer Basisadresse erstellt. Anschließend wird der Rest der Adresse relativ zur Basisadresse als Teil eines Endpunkts angegeben. Diese Partitionierung der Adresse ermöglicht die einfachere Definition von mehreren Endpunkten für Dienste an einem Host.

ms735096.note(de-de,VS.100).gifHinweis:
Eigenschaften von ServiceDescription in der Dienstanwendung dürfen nicht im Anschluss an die OnOpening-Methode auf ServiceHostBase geändert werden. Einige Member, wie die Credentials-Eigenschaft und die AddServiceEndpoint-Methoden auf ServiceHostBase und ServiceHost, lösen eine Ausnahme aus, wenn eine Änderung über diesen Punkt hinaus stattfindet. Andere Member können geändert werden, wobei das Ergebnis jedoch nicht definiert ist.

Ähnlich verhält es sich mit den ServiceEndpoint-Werten, die auf dem Client nach dem Aufruf von OnOpening auf ChannelFactory nicht geändert werden dürfen. Die Credentials-Eigenschaft löst eine Ausnahme aus, wenn sie über diesen Punkt hinaus geändert wird. Die anderen Clientbeschreibungswerte können ohne Fehler geändert werden, aber das Ergebnis ist nicht definiert.

Sowohl für den Dienst als auch den Client wird empfohlen, die Beschreibung vor dem Aufruf von Open zu ändern.

Definieren von Endpunkten in der Konfiguration

Beim Erstellen einer Anwendung sollen dem Administrator, der die Anwendung bereitstellt, Entscheidungen häufig verzögert mitgeteilt werden. Beispielsweise weiß man häufig nicht, welche Dienstadresse (URI) verwendet wird. Anstatt eine Adresse fest zu programmieren, sollte diese Aufgabe einem Administrator nach dem Erstellen eines Diensts übergeben werden. Diese Flexibilität wird durch Konfiguration ermöglicht. Ausführliche Informationen finden Sie unter Konfigurieren von Diensten.

ms735096.note(de-de,VS.100).gifHinweis:
Verwenden Sie das ServiceModel Metadata Utility-Tool (Svcutil.exe) mit dem Schalter /config:Dateiname[,Dateiname], um rasch Konfigurationsdateien zu erstellen.

Verwenden von Standardendpunkten

Wenn im Code oder in der Konfiguration keine Endpunkte angegeben sind, stellt die Runtime Standardendpunkte bereit, indem ein Standardendpunkt für alle Basisadressen in jedem Dienstvertrag, der vom Dienst implementiert wird, hinzugefügt wird. Die Basisadresse kann im Code oder in der Konfiguration angegeben werden, und die Standardendpunkte werden hinzugefügt, wenn Open auf dem ServiceHost aufgerufen wird. Dieses Beispiel entspricht dem Beispiel aus dem vorherigen Abschnitt. Da aber keine Endpunkte angegeben sind, werden die Standardendpunkte hinzugefügt.

Namespace Echo
{
   // Define the contract for the IEcho service 
   [ServiceContract]
   Interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   Class Echo : IEcho
   {
      Public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("https://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo 
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("https://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

Wenn Endpunkte explizit bereitgestellt werden, können die Standardpunkte dennoch hinzugefügt werden, indem AddDefaultEndpoints auf dem ServiceHost vor Open aufgerufen wird. Weitere Informationen über zu Standardendpunkten finden Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste.

Siehe auch

Konzepte

Implementieren von Dienstverträgen