Konfigurieren von Bindungen für Windows Communication Foundation-Dienste

Beim Erstellen einer Anwendung möchten Sie dem Administrator nach Bereitstellung der Anwendung möglicherweise Entscheidungen mitteilen. Beispielsweise wissen Sie häufig nicht im Voraus, welche Dienstadresse oder welcher URI (Uniform Resource Identifier) 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.

Tipp

Zum schnellen Erstellen von Konfigurationsdateien verwenden Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) mit dem /config-Schalter.

Hauptabschnitte

Das Windows Communication Foundation (WCF)-Konfigurationsschema schließt die folgenden drei Hauptabschnitte ein (serviceModel, bindings und services):

<configuration>
    <system.serviceModel>
        <bindings>
        </bindings>
        <services>
        </services>
        <behaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

ServiceModel-Elemente

Sie können den vom system.ServiceModel -Element umschlossenen Abschnitt zum Konfigurieren eines Diensttyps mit mindestens einem Endpunkt und die Einstellungen eines Diensts verwenden. Jeder Endpunkt kann dann mit einer Adresse, einem Vertrag und einer Bindung konfiguriert werden. Weitere Informationen zu Endpunkten finden Sie unter Übersicht über die Endpunkterstellung.

Eine Bindung gibt Transporte (HTTP, TCP, Pipes und Message Queuing) sowie Protokolle (Sicherheit, Verlässlichkeit, Transaktionsflüsse) an und besteht aus Bindungselementen, von denen jedes einen Aspekt der Kommunikation eines Endpunkts mit der Welt angibt.

Das Angeben des basicHttpBinding-Elements zeigt z. B. an, dass HTTP als Transport für einen Endpunkt verwendet wird. Auf diese Weise wird der Endpunkt zur Laufzeit aktiviert, wenn der Dienst, der diesen Endpunkt verwendet, geöffnet wird.

Es gibt zwei Arten von Bindungen: vordefinierte und benutzerdefinierte. Vordefinierte Bindungen enthalten nützliche Kombinationen von Elementen, die in allgemeinen Szenarien verwendet werden. Eine Liste vordefinierter Bindungstypen, die WCF bereitstellt, finden Sie unter Vom System bereitgestellte Bindungen. Wenn keine vordefinierte Bindungsauflistung über die korrekte Kombination von Features verfügt, die eine Dienstanwendung benötigt, können Sie benutzerdefinierte Bindungen erstellen, um den Anforderungen der Anwendung zu entsprechen. Weitere Informationen zu benutzerdefinierten Bindungen finden Sie unter <customBinding>.

In den folgenden vier Beispielen werden die am häufigsten verwendeten Bindungskonfigurationen dargestellt, die zum Einrichten eines WCF-Diensts verwendet werden.

Angeben eines Endpunkts, um einen Bindungstyp zu verwenden

Das erste Beispiel zeigt, wie ein Endpunkt angegeben wird, der mit einer Adresse, einem Vertrag oder einer Bindung konfiguriert wurde.

<service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <endpoint 
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
  </endpoint>
</service>

In diesem Beispiel gibt das type-Attribut an, für welchen Diensttyp die Konfiguration verwendet wird. Wenn Sie in Ihrem Code einen Dienst mit dem HelloWorld-Vertrag erstellen, wird er mit allen in der Beispielkonfiguration definierten Endpunkten initialisiert. Wenn die Assembly nur einen Dienstvertrag implementiert, kann das type -Attribut weggelassen werden, da der Dienst den einzigen verfügbaren Typ verwenden. Das Attribut nimmt eine Zeichenfolge, die im Format Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null vorliegen muss

Das address-Attribut gibt den URI an, den andere Endpunkte für die Kommunikation mit dem Dienst verwenden. Der URI kann entweder ein absoluter oder relativer Pfad sein. Bei Bereitstellung einer relativen Adresse wird vom Host erwartet, dass er eine Basisadresse bereitstellt, die für das in der Bindung verwendete Transportschema geeignet ist. Wenn keine Adresse konfiguriert wird, wird angenommen, dass die Basisadresse der Adresse für diesen Endpunkt entspricht.

Das contract-Attribut gibt den Vertrag an, den dieser Endpunkt verfügbar macht. Der Dienstimplementierungstyp muss den Vertragstyp implementieren. Wenn eine Dienstimplementierung einen einzelnen Vertragstyp implementiert, kann diese Eigenschaft ausgelassen werden.

Das binding-Attribut wählt eine vordefinierte oder benutzerdefinierte Bindung aus, die für diesen speziellen Endpunkt verwendet werden soll. Ein Endpunkt, der eine Bindung nicht explizit auswählt, verwendet die standardmäßige Bindungsauswahl BasicHttpBinding.

Ändern einer vordefinierten Bindung

Im folgenden Beispiel wird eine vordefinierte Bindung geändert und benannt. Sie kann anschließend verwendet werden, um einen beliebigen Endpunkt im Dienst zu konfigurieren. Die Bindung wird geändert, indem der ReceiveTimeout-Wert auf 1 Sekunde festgelegt wird. Beachten Sie, dass die Eigenschaft ein TimeSpan-Objekt zurückgibt.

Diese geänderte Bindung finden Sie im Bindungsabschnitt, und die geänderte Bindung erhält einen eindeutigen Namen, shortTimeout, der vom name-Attribut festgelegt wird. Diese geänderte Bindung kann jetzt beim Erstellen von Endpunkten durch Festlegen des binding-Attributs im endpoint-Element auf den eindeutigen Namen verwendet werden. Dies ermöglicht Ihnen eine fast unbegrenzte Anzahl von Variationen der Standardbindung.

Tipp

Wenn Sie keine Variationen einer Standardbindung erstellen, müssen Sie das bindingConfiguration-Attribut nicht auf einen Wert festlegen. In diesem Fall wird die unveränderte vordefinierte Bindung verwendet.

<service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <endpoint 
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
  </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        receiveTimeout="00:00:01"
    />
</bindings>

Konfigurieren eines Verhaltens für einen Dienst

Im folgenden Beispiel wird ein bestimmtes Verhalten für den Diensttyp konfiguriert. Das metadataPublishing-Element wird zum Aktivieren des ServiceModel Metadata Utility Tools (Svcutil.exe) verwendet, um den Dienst abzufragen und WSDL-Dokumente (Web Services Description Language) aus den Metadaten zu erstellen.

<behaviors>
    <behavior name="MetaPlusExceptions" >
        <metadataPublishing enableGetWsdl="true" /> 
    </behavior>
</behaviors>
<services>
    <service 
       type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
       serviceBehaviorName="MetaPlusExceptions">
       <endpoint 
          address="http://computer:8080/Hello"
          contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
          binding="basicHttpBinding" />
       </endpoint>
    </service>
</services>

Die vorangehende Konfiguration ermöglicht einem Client,

svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl

aufzurufen und die Metadaten vom "HelloWorld"-Dienst zu erhalten.

Angeben eines Diensts mit zwei Endpunkten mithilfe unterschiedlicher Bindungswerte

In diesem letzten Beispiel werden zwei Endpunkte für den Hello-Diensttyp konfiguriert. Jeder Endpunkt verwendet ein anderes benutzerdefiniertes bindingConfiguration -Attribut desselben Bindungstyps (jedes ändert die basicHttpBinding).

<service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
    <endpoint
        address="http://computer:8080/Hello"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="shortTimeout"
    </endpoint>
    <endpoint
        address="http://computer:8080/Hello"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="Secure"
     </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        timeout="00:00:00:01" 
     />
     <basicHttpBinding 
        name="Secure" />
        <Security mode="Transport" />
</bindings>

Siehe auch

Konzepte

Vom System bereitgestellte Bindungen
Übersicht über die Endpunkterstellung
Verwenden von Bindungen, um Dienste und Clients zu konfigurieren