Konfigurieren der Suche in einer Konfigurationsdatei

Es gibt vier Hauptgruppen von Konfigurationseinstellungen, die bei der Suche verwendet wurden. In diesem Thema werden die Gruppen beschrieben und jeweils Beispiele für deren Konfiguration angegeben. Nach jedem Abschnitt folgt ein Link zu einer ausführlicheren Dokumentation der einzelnen Bereiche.

Verhaltenskonfiguration

Bei der Suche werden Dienstverhalten und Endpunktverhalten verwendet. Das ServiceDiscoveryBehavior-Verhalten aktiviert die Suche für alle Endpunkte eines Diensts und ermöglicht Ihnen die Angabe von Ankündigungsendpunkten. Das folgende Beispiel zeigt, wie Sie das ServiceDiscoveryBehavior hinzufügen und einen Ankündigungsendpunkt angeben.

<behaviors>
      <serviceBehaviors>
        <behavior name="helloWorldServiceBehavior">
          <serviceDiscovery>
            <announcementEndpoints>
              <endpoint kind="udpAnnouncementEndpoint"/>
            </announcementEndpoints>
          </serviceDiscovery>
        </behavior>
      </serviceBehaviors>
</behaviors>

Nachdem Sie das Verhalten angegeben haben, verweisen Sie aus einem <service>-Element darauf, wie im folgenden Beispiel gezeigt wird.

<system.serviceModel>
   <services>
      <service name="HelloWorldService" behaviorConfiguration="helloWorldServiceBehavior">
         <!-- Application Endpoint -->
         <endpoint address="endpoint0"
                   binding="basicHttpBinding"
                   contract="IHelloWorldService" />
         <!-- Discovery Endpoints -->
         <endpoint kind="udpDiscoveryEndpoint" />
        </service>
    </services>
</system.serviceModel>

Damit ein Dienst erkennbar ist, müssen Sie auch einen Suchendpunkt hinzufügen. Im Beispiel oben wird ein UdpDiscoveryEndpoint-Standardendpunkt hinzugefügt.

Wenn Sie Ankündigungsendpunkte hinzufügen, müssen Sie dem <services>-Element auch einen Ankündigungslistenerdienst hinzufügen, wie im folgenden Beispiel gezeigt wird.

<services>
   <service name="HelloWorldService" behaviorConfiguration="helloWorldServiceBehavior">
      <!-- Application Endpoint -->
      <endpoint address="endpoint0"
                binding="basicHttpBinding"
                contract="IHelloWorldService" />
      <!-- Discovery Endpoints -->
      <endpoint kind="udpDiscoveryEndpoint" />
   </service>
   <!-- Announcement Listener Configuration -->
   <service name="AnnouncementListener">
      <endpoint kind="udpAnnouncementEndpoint" />
   </service>
</services>

Das EndpointDiscoveryBehavior-Verhalten wird verwendet, um die Suche nach einem bestimmten Endpunkt zu aktivieren oder zu deaktivieren. Im folgenden Beispiel wird ein Dienst mit zwei Anwendungsendpunkten konfiguriert, wobei die Suche für einen Endpunkt aktiviert und für den anderen deaktiviert ist. Für jeden Endpunkt wird ein EndpointDiscoveryBehavior-Verhalten hinzugefügt.

<system.serviceModel>
   <services>
      <service name="HelloWorldService"
               behaviorConfiguration="helloWorldServiceBehavior">

        <!-- Application Endpoints -->
        <endpoint address="endpoint0"
                 binding="basicHttpBinding"
                 contract="IHelloWorldService"
                 behaviorConfiguration="ep0Behavior" />

        <endpoint address="endpoint1"
                  binding="basicHttpBinding"
                  contract="IHelloWorldService"
                  behaviorConfiguration="ep1Behavior" />

        <!-- Discovery Endpoints -->
        <endpoint kind="udpDiscoveryEndpoint" />
      </service>
   </services>
   <behaviors>
      <serviceBehaviors>
        <behavior name="helloWorldServiceBehavior">
          <serviceDiscovery />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="ep0Behavior">
          <endpointDiscovery enabled="true"/>
        </behavior>
        <behavior name="ep1Behavior">
          <endpointDiscovery enabled="false"/>
        </behavior>
     </endpointBehaviors>
   </behaviors>
</system.serviceModel>

Sie können das EndpointDiscoveryBehavior-Verhalten auch verwenden, um den vom Dienst zurückgegebenen Endpunktmetadaten benutzerdefinierte Metadaten hinzuzufügen. Das folgende Beispiel zeigt die erforderliche Vorgehensweise.

<behavior name="ep4Behavior">
   <endpointDiscovery enabled="true">
      <extensions>
         <CustomMetadata>This is custom metadata.</CustomMetadata>
         <d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:i="http://printer.example.org/2003/imaging">i:PrintBasic</d:Types>
         <CustomMetadata nested="true">
            <NestedMetadata>This is a nested custom metadata.</NestedMetadata>
         </CustomMetadata>
      </extensions>
   </endpointDiscovery>
</behavior>

Sie können das EndpointDiscoveryBehavior-Verhalten auch verwenden, um Bereiche und Typen hinzuzufügen, mit denen Clients nach Diensten suchen. Im folgenden Beispiel wird gezeigt, wie Sie dies in einer clientseitigen Konfigurationsdatei durchführen können.

<behavior name="ep2Behavior">
   <endpointDiscovery enabled="true">
      <scopes>
         <add scope="http://www.microsoft.com/building42/floor1"/>
         <add scope="ldap:///ou=engineeringo=examplecomc=us"/>
      </scopes>
      <types>
         <add name="test" namespace="http://example.microsoft.com/" />
         <add name="additionalContract" namespace="http://example.microsoft.com/" />
      </types>
   </endpointDiscovery>
</behavior>

Weitere Informationen zu ServiceDiscoveryBehavior und EndpointDiscoveryBehavior finden Sie unter Übersicht über die WCF-Suche.

Bindungselementkonfiguration

Die Bindungselementkonfiguration eignet sich am besten auf der Clientseite. Sie können die Konfiguration verwenden, um die Suchkriterien anzugeben, mit deren Hilfe die Dienste einer WCF-Clientanwendung ermittelt werden. Im folgenden Beispiel wird eine benutzerdefinierte Bindung mit dem DiscoveryClient-Kanal erstellt, und es werden die Suchkriterien angegeben, die einen Typ und einen Bereich enthalten. Außerdem werden Werte für die Eigenschaften Duration und MaxResults angegeben.

<bindings>
   <customBinding>
      <!-- Binding Configuration for the Application Endpoint -->
      <binding name="discoBindingConfiguration">
         <discoveryClient>
            <endpoint kind="discoveryEndpoint"
                      address="http://localhost:8000/ConfigTest/Discovery"
                      binding="customBinding"
                      bindingConfiguration="httpSoap12WSAddressing10"/>
            <findCriteria duration="00:00:10" maxResults="2">
              <types>
                <add name="IHelloWorldService"/>
              </types>
              <scopes>
                <add scope="http://www.microsoft.com/building42/floor1"/>
              </scopes>
            </findCriteria>
          </discoveryClient>
          <textMessageEncoding messageVersion="Soap11"/>
          <httpTransport />
      </binding>
   </customBinding>
</bindings>

Auf diese benutzerdefinierte Bindungskonfiguration muss von einem Clientendpunkt aus verwiesen werden:

<client>
      <endpoint address="http://schemas.microsoft.com/discovery/dynamic"
                binding="customBinding"
                bindingConfiguration="discoBindingConfiguration"
                contract="IHelloWorldService" />
</client>

Weitere Informationen zu Suchkriterien finden Sie unter Suche nach „Find“ und „FindCriteria“. Weitere Informationen zu Ermittlungs- und Bindungselementen finden Sie unter Übersicht über die WCF-Suche.

Konfiguration eines Standardendpunkts

Standardendpunkte sind vordefinierte Endpunkte, die Standardwerte für eine oder mehrere Eigenschaften (Adresse, Bindung oder Vertrag) bzw. einen oder mehrere Eigenschaftenwerte aufweisen, die nicht geändert werden können. Im Lieferumfang von .NET 4 sind drei Standardendpunkte für die Suche enthalten: UdpDiscoveryEndpoint, UdpAnnouncementEndpoint und DynamicEndpoint. Die UdpDiscoveryEndpoint-Klasse ist ein Standardendpunkt, der für Suchvorgänge über eine UDP-Multicastbindung vorkonfiguriert ist. UdpAnnouncementEndpoint ist ein Standardendpunkt, der für das Senden von Ankündigungsnachrichten über eine UDP-Bindung vorkonfiguriert ist. DynamicEndpoint ist ein Standardendpunkt, der zur Laufzeit mithilfe der Suche dynamisch nach der Endpunktadresse eines ermittelten Diensts sucht. Standardbindungen werden mit einem <endpoint>-Element angegeben, in dem ein „kind“-Attribut enthalten ist, das den Typ des hinzuzufügenden Standardendpunkts angegeben hat. Im folgenden Beispiel wird gezeigt, wie ein UdpDiscoveryEndpoint und ein UdpAnnouncementEndpoint addiert werden.

<services>
   <service name="HelloWorldService">
      <!-- ...  -->
      <endpoint kind="udpDiscoveryEndpoint" />
   </service>
   <service name="AnnouncementListener">
      <endpoint kind="udpAnnouncementEndpoint" />
   </service>
</services>

Standardendpunkte werden in einem <standardEndpoints>-Element konfiguriert. Das folgende Beispiel zeigt, wie Sie UdpDiscoveryEndpoint und UdpAnnouncementEndpoint konfigurieren.

<standardEndpoints>
      <udpAnnouncementEndpoint>
        <standardEndpoint
            name="udpAnnouncementEndpointSettings"
            multicastAddress="soap.udp://239.255.255.250:3703"
            maxAnnouncementDelay="00:00:00.800">
          <transportSettings
            duplicateMessageHistoryLength="1028"
            maxPendingMessageCount="10"
            maxMulticastRetransmitCount="3"
            maxUnicastRetransmitCount="2"
            socketReceiveBufferSize="131072"
            timeToLive="2" />
        </standardEndpoint>
      </udpAnnouncementEndpoint>
      <udpDiscoveryEndpoint>
        <standardEndpoint
            name="udpDiscoveryEndpointSettings"
            multicastAddress="soap.udp://239.255.255.252:3704"
            maxResponseDelay="00:00:00.800">
          <transportSettings
            duplicateMessageHistoryLength="2048"
            maxPendingMessageCount="5"
            maxReceivedMessageSize="8192"
            maxBufferPoolSize="262144"/>
        </standardEndpoint>
      </udpDiscoveryEndpoint>
</standardEndpoints>

Nachdem Sie die Konfiguration eines Standardendpunkts hinzugefügt haben, verweisen Sie im <endpoint>-Element für jeden Endpunkt darauf, wie im folgenden Beispiel gezeigt wird.

<services>
   <service name="HelloWorldService">
      <!-- ...  -->
      <endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="udpDiscoveryEndpointSettings"/>
   </service>
   <service name="AnnouncementListener">
      <endpoint kind="udpAnnouncementEndpoint" endpointConfiguration="udpAnnouncementEndpointSettings" />
   </service>
</services>

Im Gegensatz zu den anderen Standardendpunkten, die in der Suche verwendet werden, geben Sie für DynamicEndpoint eine Bindung und einen Vertrag an. Das folgende Beispiel zeigt, wie Sie DynamicEndpoint hinzufügen und konfigurieren.

<system.serviceModel>
    <client>
      <endpoint kind="dynamicEndpoint" binding="basicHttpBinding" contract="IHelloWorldService" endpointConfiguration="dynamicEndpointConfiguration" />
    </client>
   <standardEndpoints>
      <dynamicEndpoint>
         <standardEndpoint name="dynamicEndpointConfiguration">
             <discoveryClientSettings>
              <findCriteria scopeMatchBy="http://schemas.microsoft.com/ws/2008/06/discovery/rfc" duration="00:00:10" maxResults="2">
                 <types>
                   <add name="IHelloWorldService"/>
                 </types>
                 <scopes>
                   <add scope="http://www.microsoft.com/building42/floor1"/>
                 </scopes>
                 <extensions>
                   <CustomMetadata>This is custom metadata.</CustomMetadata>
                 </extensions>
               </findCriteria>
             </discoveryClientSettings>
           </standardEndpoint>
         </dynamicEndpoint>
   </standardEndpoints>
</system.serviceModel>

Weitere Informationen zu Standardendpunkten finden Sie unter Standardendpunkte.