Teilen über


Übersicht über die Endpunkterstellung

Die gesamte Kommunikation mit einem Windows Communication Foundation (WCF)-Dienst erfolgt über die Endpunkte des Diensts . Endpunkte bieten den Clients Zugriff auf die Funktionalität, die ein WCF-Dienst anbietet. In diesem Abschnitt wird die Struktur eines Endpunkts beschrieben und beschrieben, wie ein Endpunkt in der Konfiguration und im Code definiert wird.

Die Struktur eines Endpunkts

Jeder Endpunkt enthält eine Adresse, die angibt, wo der Endpunkt gefunden werden soll, eine Bindung, die angibt, wie ein Client mit dem Endpunkt kommunizieren kann, und einen Vertrag, der die verfügbaren Methoden identifiziert.

  • Adresse. Die Adresse identifiziert den Endpunkt eindeutig und teilt potenziellen Verbrauchern mit, wo sich der Dienst befindet. Sie wird im WCF-Objektmodell durch die EndpointAddress Adresse dargestellt, die einen URI (Uniform Resource Identifier) und Adresseigenschaften enthält, die eine Identität, einige WSDL-Elemente (Web Services Description Language) und eine Sammlung optionaler Header enthalten. Die optionalen Header bieten zusätzliche detaillierte Adressierungsinformationen zum Identifizieren oder Interagieren mit dem Endpunkt. Weitere Informationen finden Sie unter Angeben einer Endpunktadresse.

  • Bindung. Die Bindung gibt an, wie mit dem Endpunkt kommuniziert werden soll. Die Bindung gibt an, wie der Endpunkt mit der Welt kommuniziert, einschließlich des zu verwendenden Transportprotokolls (z. B. TCP oder HTTP), welche Codierung für die Nachrichten verwendet werden soll (z. B. Text oder Binär), und welche Sicherheitsanforderungen erforderlich sind (z. B. Secure Sockets Layer [SSL] oder SOAP-Nachrichtensicherheit). Weitere Informationen finden Sie unter Verwenden von Bindungen zum Konfigurieren von Diensten und Clients.

  • Servicevertrag. Der Dienstvertrag beschreibt, welche Funktionalität der Endpunkt für den Client verfügbar macht. Ein Vertrag gibt die Vorgänge an, die ein Client aufrufen kann, das Formular der Nachricht und den Typ von Eingabeparametern oder Daten, die zum Aufrufen des Vorgangs erforderlich sind, und die Art der Verarbeitung oder Antwortnachricht, die der Client erwarten kann. Drei grundlegende Vertragstypen entsprechen grundlegenden Nachrichtenaustauschmustern (MEPs): Datagram (unidirektional), Anforderung/Antwort und Duplex (bidirektional). Der Servicevertrag kann auch Daten- und Nachrichtenverträge verwenden, um bestimmte Datentypen und Nachrichtenformate beim Zugriff zu erfordern. Weitere Informationen zum Definieren eines Servicevertrags finden Sie unter Entwerfen von Serviceverträgen. Beachten Sie, dass ein Client möglicherweise auch einen vom Dienst festgelegten Vertrag implementieren muss, einen sogenannten Rückrufvertrag, um Nachrichten vom Dienst im Duplex-MEP zu empfangen. Weitere Informationen finden Sie unter Duplexdienste.

Der Endpunkt für einen Dienst kann entweder mithilfe von Code oder deklarativ über die Konfiguration angegeben werden. Wenn keine Endpunkte angegeben werden, stellt die Laufzeit Standardendpunkte bereit, indem für jede Basisadresse für jeden vom Dienst implementierten Dienstvertrag ein Standardendpunkt hinzugefügt wird. Das Definieren von Endpunkten im Code ist in der Regel nicht praktikabel, da sich die Bindungen und Adressen für einen bereitgestellten Dienst in der Regel von denen unterscheiden, die während der Entwicklung des Diensts verwendet werden. Im Allgemeinen ist es praktischer, Dienstendpunkte mithilfe von Konfiguration und nicht mit Code zu definieren. Durch das Trennen von Bindungs- und Adressierungsinformationen vom Code können diese geändert werden, ohne dass die Anwendung neu kompiliert und bereitgestellt werden muss.

Hinweis

Wenn Sie einen Dienstendpunkt hinzufügen, der Impersonation verwendet, müssen Sie entweder eine der AddServiceEndpoint Methoden oder die GetContract(Type, Type) Methode nutzen, um den Vertrag korrekt in ein neues ServiceDescription Objekt zu laden.

Definieren von Endpunkten im Code

Im folgenden Beispiel wird veranschaulicht, wie man einen Endpunkt im Code mit dem Folgenden angibt:

  • 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 ist.

  • Geben Sie für den Dienst eine Endpunktadresse von http://localhost:8000/Echo an.

  • Konfigurieren Sie den Echo Dienst mithilfe einer WSHttpBinding Bindung.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public 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 + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://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("http://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()

Hinweis

Der Diensthost wird mit einer Basisadresse erstellt und dann die restliche Adresse relativ zur Basisadresse als Teil eines Endpunkts angegeben. Durch diese Partitionierung der Adresse können mehrere Endpunkte für Dienste auf einem Host bequemer definiert werden.

Hinweis

Die Eigenschaften von ServiceDescription in der Dienstanwendung dürfen nach der OnOpening-Methode auf ServiceHostBase nicht geändert werden. Einige Elemente, z. B. die Credentials-Eigenschaft und die AddServiceEndpoint-Methoden auf ServiceHostBase und ServiceHost, lösen eine Ausnahme aus, wenn sie über diesen Punkt hinaus geändert werden. Andere erlauben Es Ihnen, sie zu ändern, aber das Ergebnis ist nicht definiert.

Ä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 geändert wurde. Die anderen Clientbeschreibungswerte können ohne Fehler geändert werden, aber das Ergebnis ist nicht definiert.

Ob es um den Dienst oder den Klienten geht, es wird empfohlen, die Beschreibung zu ändern, bevor Open aufgerufen wird.

Definieren von Endpunkten in der Konfiguration

Beim Erstellen einer Anwendung möchten Sie häufig Entscheidungen an den Administrator zurückstellen, der die Anwendung bereitstellt. Beispielsweise gibt es häufig keine Möglichkeit, im Voraus zu wissen, was eine Dienstadresse (ein URI) sein wird. Anstatt eine Adresse hartcodieren zu müssen, empfiehlt es sich, einem Administrator dies nach dem Erstellen eines Diensts zu ermöglichen. Diese Flexibilität wird durch Konfiguration erreicht. Ausführliche Informationen finden Sie unter Konfigurieren von Diensten.

Hinweis

Verwenden Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) mit dem /config:Dateinamen[,Dateinamenswechsel], um schnell Konfigurationsdateien zu erstellen.

Verwenden von Standardendpunkten

Wenn keine Endpunkte im Code oder in der Konfiguration angegeben sind, stellt die Laufzeit Standardendpunkte bereit, indem für jede Basisadresse für jeden vom Dienst implementierten Dienstvertrag ein Standardendpunkt hinzugefügt wird. Die Basisadresse kann im Code oder in der Konfiguration angegeben werden, und die Standardendpunkte werden hinzugefügt, wenn Open() auf ServiceHost aufgerufen wird. Dieses Beispiel ist dasselbe Beispiel aus dem vorherigen Abschnitt, aber da keine Endpunkte angegeben werden, werden die Standardendpunkte hinzugefügt.

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

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://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("http://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 Standardendpunkte weiterhin durch Aufrufen von AddDefaultEndpoints auf den ServiceHost hinzugefügt werden, bevor Open aufgerufen wird. Weitere Informationen zu Standardendpunkten finden Sie unter Vereinfachte Konfiguration und vereinfachte Konfiguration für WCF-Dienste.

Siehe auch