Compartilhar via


Configurando a descoberta em um arquivo de configuração

Há quatro grupos principais de configurações usadas na descoberta. Este tópico descreverá brevemente cada um e mostrará exemplos de como configurá-los. Seguir cada seção será um link para uma documentação mais detalhada sobre cada área.

Configuração de comportamento

A descoberta usa comportamentos de serviço e comportamentos de ponto de extremidade. O comportamento ServiceDiscoveryBehavior permite a descoberta de todos os pontos de extremidade de um serviço e permite que você especifique pontos de extremidade de anúncio. O exemplo a seguir mostra como adicionar o ServiceDiscoveryBehavior e especificar um ponto de extremidade de anúncio.

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

Depois de especificar o comportamento, faça referência a ele a partir de um elemento <service>, conforme mostrado no exemplo a seguir.

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

Para que um serviço seja detectável, você também deve adicionar um ponto de extremidade de descoberta. O exemplo acima adiciona um ponto de extremidade padrão UdpDiscoveryEndpoint.

Ao adicionar pontos de extremidade de anúncio, você também deve adicionar um serviço de ouvinte de anúncio ao elemento <services>, conforme mostrado no exemplo a seguir.

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

O comportamento EndpointDiscoveryBehavior é usado para habilitar ou desabilitar a descoberta de um ponto de extremidade específico. O exemplo a seguir configura um serviço com dois pontos de extremidade de aplicativo, um com descoberta habilitada e outro com descoberta desabilitada. Para cada ponto de extremidade, um comportamento EndpointDiscoveryBehavior é adicionado.

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

O comportamento EndpointDiscoveryBehavior também pode ser usado para adicionar metadados personalizados aos metadados de ponto de extremidade retornados pelo serviço. O exemplo a seguir mostra como fazer isso.

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

O comportamento EndpointDiscoveryBehavior também pode ser usado para adicionar escopos e tipos que os clientes usam para pesquisar serviços. O exemplo a seguir mostra como fazer isso em um arquivo de configuração do lado do cliente.

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

Para obter mais informações sobre ServiceDiscoveryBehavior e EndpointDiscoveryBehavior, consulte Visão geral de descoberta do WCF.

Configuração do elemento de associação

A configuração do elemento de associação é mais interessante no lado do cliente. Você pode usar a configuração para especificar os critérios de localização usados para descobrir serviços de um aplicativo de cliente WCF. O exemplo a seguir cria uma associação personalizada com o canal DiscoveryClient e especifica critérios de localização que incluem um tipo e um escopo. Além disso, especifica valores para as propriedades Duration e MaxResults.

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

Essa configuração de associação personalizada deve ser referenciada por um ponto de extremidade do cliente:

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

Para obter mais informações sobre critérios de localização, consulte FindCriteria e localização de descoberta. Para obter mais informações sobre elementos de descoberta e associação, consulte Visão geral da descoberta do WCF

Configuração de ponto de extremidade padrão

Os pontos de extremidade padrão são pontos de extremidade predefinidos que têm valores padrão para uma ou mais propriedades (endereço, associação ou contrato) ou um ou mais valores de propriedade que não podem ser alterados. O .NET 4 é fornecido com três pontos de extremidade padrão relacionados à descoberta: UdpDiscoveryEndpoint, UdpAnnouncementEndpoint e DynamicEndpoint. O UdpDiscoveryEndpoint é um ponto de extremidade padrão pré-configurado para operações de descoberta por meio de uma associação multicast UDP. O UdpAnnouncementEndpoint é um ponto de extremidade padrão pré-configurado para enviar mensagens de comunicado por meio de uma associação UDP. O DynamicEndpoint é um ponto de extremidade padrão que usa a descoberta para localizar o endereço do ponto de extremidade de um serviço descoberto dinamicamente em tempo de execução. As associações padrão são especificadas com um elemento <endpoint> que contém um atributo de tipo que especificou o tipo de ponto de extremidade padrão a ser adicionado. O exemplo a seguir mostra como adicionar um UdpDiscoveryEndpoint e um UdpAnnouncementEndpoint.

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

Os pontos de extremidade padrão são configurados em um elemento <standardEndpoints>. O exemplo a seguir mostra como configurar o UdpDiscoveryEndpoint e o 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>
</standardEndpoints>

Depois de adicionar a configuração de ponto de extremidade padrão, faça referência à configuração no elemento <endpoint> para cada ponto de extremidade, conforme mostrado no exemplo a seguir.

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

Ao contrário dos outros pontos de extremidade padrão usados na descoberta, você especifica uma associação e um contrato para DynamicEndpoint. O exemplo a seguir mostra como habilitar e configurar o DynamicEndpoint.

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

Para obter mais informações sobre pontos de extremidade padrão, consulte Pontos de extremidade padrão.