Настройка обнаружения в файле конфигурации

При обнаружении используются четыре основные группы параметров конфигурации. В этом разделе кратко описана каждая из них, а также приведены примеры их настройки. В конце каждого раздела имеется ссылка на более подробную документацию о каждой области.

Конфигурация поведения

При обнаружении используется поведение служб и конечных точек. Поведение ServiceDiscoveryBehavior позволяет обнаруживать все конечные точки службы, а также указывать конечные точки объявлений. В следующем примере показано, как добавить поведение ServiceDiscoveryBehavior и указать конечную точку объявления.

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

Указав поведение, установите на него ссылку из элемента <service>, как показано в следующем образце.

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

Чтобы обеспечить возможность обнаружения службы, также необходимо добавить конечную точку обнаружения. В рассмотренном выше примере добавляется стандартная конечная точка UdpDiscoveryEndpoint.

При добавлении конечных точек объявления также необходимо добавить службу прослушивания объявления в элемент <services>, как показано в следующем примере.

<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>

Поведение EndpointDiscoveryBehavior используется для включения или выключения обнаружения определенной конечной точки. В следующем примере показана настройка двух конечных точек приложения для службы, одной со включенным обнаружением, другой ― с выключенным. Для каждой конечной точки добавляется поведение EndpointDiscoveryBehavior.

<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>

Поведение EndpointBehavior можно также использовать для добавления пользовательских метаданных к метаданным конечной точки, возвращенным службой. Следующий пример показывает, как это сделать.

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

Поведение EndpointDiscoveryBehavior можно также использовать для добавления областей и типов, с помощью которых клиент выполняет поиск служб. В следующем примере показано, как задать это в файле конфигурации на стороне клиента.

<behavior name="ep2Behavior">
   <endpointDiscovery enabled="true">
      <scopes>
         <add scope="https://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>

Дополнительные сведения ServiceDiscoveryBehavior и EndpointDiscoveryBehavior см. в разделе Общие сведения об обнаружении WCF.

Настройка элемента привязки

Настройка элемента привязки представляет наибольший интерес на стороне клиента. С ее помощью можно указать критерии поиска, используемые для обнаружения служб из клиентского приложения WCF. Следующий пример создает пользовательскую привязку с каналом DiscoveryClient и указывает критерии поиска, включая тип и область. Кроме того, он также указывает значения для свойств Duration и MaxResults.

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

На эту пользовательскую конфигурацию привязки должна ссылаться клиентская конечная точка.

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

Дополнительные сведения критериях поиска см. в разделе Объекты обнаружения Find и FindCriteria. Дополнительные сведения обнаружении и элементах привязки см. в разделе Общие сведения об обнаружении WCF

Конфигурация стандартной конечной точки

Стандартные конечные точки — точки, имеющие значения по умолчанию одного или нескольких свойств (адрес, привязка или контракт), либо одно или несколько свойств, значения которых нельзя изменить. Платформа .NET 4 поставляется с тремя стандартными конечными точками, связанными с обнаружением: UdpDiscoveryEndpoint, UpdAnnouncementEndpoint и DynamicEndpoint. Конечная точка UdpDiscoveryEndpoint ― это стандартная конечная точка, настроенная для операций обнаружения через привязку для многоадресной рассылки. Конечная точка UdpAnnouncementEndpoint ― это стандартная конечная точка, настроенная для отправки сообщений с объявлениями по привязке UDP. Конечная точка DynamicEnpoint ― это стандартная конечная точка, которая использует обнаружение для динамического обнаружения адреса конечной точки во время выполнения. Стандартные привязки задаются элементом <endpoint>, который содержит атрибут типа, указывающий тип добавляемой стандартной конечной точки. В следующем примере демонстрируется, как добавить UdpDiscoveryEndpoint и UpdAnnouncementEndpoint.

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

Стандартные конечные точки настраиваются в элементе <standardEndpoints>. В следующем примере показано, как настроить UdpDiscoveryEndpoint и UdpAnnouncementEndpoint.

<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>

После добавления конфигурации стандартной конечной точки укажите ссылку на нее в элементе <endpoint> для каждой конечной точки, как показано в следующем образце.

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

В отличие от других стандартных конечных точек, используемых при обнаружении, указывается привязка и контракт для DynamicEndpoint. В следующем примере показано, как добавить и настроить DynamicEndpoint.

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

Дополнительные сведения стандартных конечных точках см. в разделе Стандартные конечные точки