Compartir vía


Configurar la detección en un archivo de configuración

Hay cuatro grupos principales de configuración usados en la detección. Este tema describirá brevemente cada uno de ellos y mostrará ejemplos de cómo configurarlos. Tras cada sección, se ofrece un vínculo a documentación más detallada sobre cada área.

Configuración de comportamiento

La detección usa comportamientos de servicio y comportamientos de extremo. El comportamiento ServiceDiscoveryBehavior permite la detección en todos los puntos de conexión de un servicio y le permite especificar los puntos de conexión de anuncio. En el siguiente ejemplo, se muestra cómo agregar ServiceDiscoveryBehavior y especificar un punto de conexión del anuncio.

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

Cuando especifique el comportamiento, haga referencia a él desde un elemento <service>, tal como se muestra en el siguiente ejemplo.

<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 un servicio sea reconocible, también debe agregar un punto de conexión de detección; en el ejemplo anterior, se agrega un punto de conexión estándar UdpDiscoveryEndpoint.

Cuando agregue puntos de conexión de anuncio, también debe agregar un servicio de escucha de anuncio al elemento <services>, tal como se muestra en el siguiente ejemplo.

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

El comportamiento EndpointDiscoveryBehavior se usa para habilitar o deshabilitar la detección de un punto de conexión concreto. En el siguiente ejemplo, se configura un servicio con dos puntos de conexión de la aplicación: uno con detección habilitada y uno con detección deshabilitada. Para cada punto de conexión, se agrega un comportamiento 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>
</system.serviceModel>

El comportamiento EndpointDiscoveryBehavior también se puede usar para agregar metadatos personalizados a los metadatos del punto de conexión devuelto por el servicio. El ejemplo siguiente muestra cómo hacerlo.

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

El comportamiento EndpointDiscoveryBehavior también se puede usar para agregar los ámbitos y los tipos que emplean los clientes para buscar servicios. El ejemplo siguiente muestra cómo realizarlo en un archivo de configuración del 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 más información sobre ServiceDiscoveryBehavior y EndpointDiscoveryBehavior, consulte Introducción a la detección de WCF.

Configuración del elemento de enlace

La configuración del elemento de enlace es más interesante para el cliente. Puede usar la configuración para especificar los criterios de búsqueda usados para detectar servicios de una aplicación cliente de WCF. El siguiente ejemplo crea un enlace personalizado con el canal DiscoveryClient y especifica criterios de búsqueda que incluyen un tipo y un ámbito. Además, especifica valores para las propiedades Duration y 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>

Un punto de conexión de cliente debe hacer referencia a esta configuración del enlace personalizado:

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

Para más información sobre los criterios de búsqueda, consulte Discovery Find y FindCriteria. Para más información sobre los elementos de detección y enlace, consulte Introducción a la detección de WCF.

Configuración de punto de conexión estándar

Los puntos de conexión estándar son puntos de conexión predefinidos que tienen valores predeterminados para una o varias propiedades (dirección, enlace o contrato) o uno o varios valores de propiedad que no se pueden modificar. .NET 4 se distribuye con 3 puntos de conexión estándar relacionados con la detección: UdpDiscoveryEndpoint, UdpAnnouncementEndpoint y DynamicEndpoint. UdpDiscoveryEndpoint es un extremo estándar pre-configurado para las operaciones de detección en un enlace de multidifusión de UDP. La clase UdpAnnouncementEndpoint es un punto de conexión estándar pre-configurado para enviar mensajes de anuncio en un enlace de UDP. DynamicEndpoint es un punto de conexión estándar que usa la detección para buscar la dirección del punto de conexión de un servicio detectado dinámicamente en tiempo de ejecución. Los enlaces estándar se especifican con un elemento <endpoint> que contiene un atributo de clase que especifica el tipo de punto de conexión estándar que se va a agregar. En el siguiente ejemplo, se muestra cómo agregar UdpDiscoveryEndpoint y UdpAnnouncementEndpoint.

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

Los puntos de conexión estándar se configuran en un elemento <standardEndpoints>. El ejemplo siguiente muestra cómo habilitar y configurar UdpDiscoveryEndpoint y 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>

Cuando haya agregado la configuración de punto de conexión estándar, haga referencia a la configuración en el elemento <endpoint> para cada punto de conexión, tal como se muestra en el siguiente ejemplo.

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

A diferencia de los otros punto de conexión estándar usados en la detección, debe especificar un enlace y un contrato para DynamicEndpoint. El ejemplo siguiente muestra cómo agregar y configurar 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 más información sobre los puntos de conexión estándar, consulte Puntos de conexión estándar.