Compartir a través de


Información general de Detección de WCF

Las API de detección proporcionan un modelo de programación unificado para la publicación dinámica y la detección de servicios web mediante el protocolo WS-Discovery. Estas API permiten a los servicios publicarse a sí mismos y a los clientes para encontrar servicios publicados. Una vez que se puede detectar un servicio, el servicio tiene la capacidad de enviar mensajes de anuncio, así como escuchar y responder a las solicitudes de detección. Los servicios reconocibles pueden enviar mensajes Hello para anunciar su llegada en una red y los mensajes bye para anunciar su salida desde una red. Para buscar un servicio, los clientes envían una Probe solicitud que contiene criterios específicos, como el tipo de contrato de servicio, las palabras clave y el ámbito de la red. Los servicios reciben la Probe solicitud y determinan si coinciden con los criterios. Si un servicio coincide, responde devolviendo un mensaje ProbeMatch al cliente con la información necesaria para ponerse en contacto con el servicio. Los clientes también pueden enviar Resolve solicitudes que les permitan encontrar servicios que puedan haber cambiado su dirección de punto de conexión. Los servicios de emparejamiento responden a las solicitudes de Resolve enviando de vuelta un mensaje ResolveMatch al cliente.

Modos ad hoc y administrados

Discovery API admite dos modos diferentes: Administrado y Ad Hoc. En el modo administrado hay un servidor centralizado denominado proxy de detección que mantiene información sobre los servicios disponibles. El proxy de detección se puede rellenar con información sobre servicios de diferentes maneras. Por ejemplo, los servicios pueden enviar mensajes de anuncio durante el inicio al proxy de detección o el proxy pueden leer datos de una base de datos o un archivo de configuración para determinar qué servicios están disponibles. La forma en que se rellena el proxy de detección depende completamente del desarrollador. Los clientes usan el proxy de detección para recuperar información sobre los servicios disponibles. Cuando un cliente busca un servicio, envía un Probe mensaje al proxy de detección y el proxy determina si alguno de los servicios que conoce coincide con el servicio que el cliente está buscando. Si se encuentran coincidencias, el proxy de detección envía una ProbeMatch respuesta al cliente. Después, el cliente puede ponerse en contacto con el servicio directamente mediante la información de servicio devuelta desde el proxy. El principio básico del modo administrado es que las solicitudes de detección se envían en modo de unidifusión a una autoridad, el proxy de detección. .NET Framework contiene componentes clave que permiten crear su propio proxy. Los clientes y servicios pueden localizar el proxy mediante varios métodos:

  • El proxy puede responder a mensajes ad hoc.

  • El proxy puede enviar un mensaje de anuncio durante el inicio.

  • Los clientes y los servicios se pueden escribir para buscar un punto de conexión conocido concreto.

En modo ad hoc, no hay ningún servidor centralizado. Todos los mensajes de descubrimiento, como los anuncios de servicio y las solicitudes de cliente, se envían de forma multicast. De forma predeterminada, .NET Framework contiene compatibilidad con la detección ad hoc a través del protocolo UDP. Por ejemplo, si un servicio está configurado para enviar un anuncio hello al iniciarse, lo envía a través de una dirección de multidifusión conocida mediante el protocolo UDP. Los clientes tienen que escuchar activamente estos anuncios y procesarlos en consecuencia. Cuando un cliente envía un Probe mensaje para un servicio, este se envía a través de la red mediante un protocolo de multidifusión. Cada servicio que recibe la solicitud determina si coincide con los criterios del Probe mensaje y responde directamente al cliente con un ProbeMatch mensaje si el servicio coincide con los criterios especificados en el Probe mensaje.

Ventajas del uso de la detección de WCF

Dado que la detección de WCF se implementa mediante el protocolo WS-Discovery, también es interoperable con otros clientes, servicios y servidores proxy que implementan WS-Discovery. La detección de WCF se basa en las API de WCF existentes, lo que facilita la adición de funcionalidad de detección a los servicios y clientes existentes. La detectabilidad del servicio se puede agregar fácilmente a través de las opciones de configuración de la aplicación. Además, la Detección de WCF también permite usar el protocolo de detección en otros transportes como redes del mismo nivel, superposiciones de nomenclatura y HTTP. La Detección de WCF proporciona soporte para un modo administrado de operación en el que se usa un proxy de detección. Esto puede reducir el tráfico de red a medida que los mensajes se envían directamente al proxy de detección en lugar de enviar mensajes de multidifusión a toda la red. La detección de WCF también permite una mayor flexibilidad al trabajar con servicios web. Por ejemplo, puede cambiar la dirección de un servicio sin tener que volver a configurar el cliente o el servicio. Cuando un cliente debe acceder al servicio, puede emitir un Probe mensaje a través de una Find solicitud y esperar que el servicio responda con su dirección actual. La detección de WCF permite a un cliente buscar un servicio en función de distintos criterios, incluidos los tipos de contrato, los elementos de enlace, el espacio de nombres, el ámbito y las palabras clave o los números de versión. La Detección de WCF habilita la detección de diseño y de tiempo de ejecución. La adición de detección a la aplicación se puede usar para habilitar otros escenarios, como la tolerancia a errores y la configuración automática.

Publicación del servicio

Para que un servicio sea reconocible, ServiceDiscoveryBehavior debe agregarse al host de servicio y se debe agregar un punto de conexión de detección para especificar dónde se deben escuchar los mensajes de detección. En el ejemplo de código siguiente se muestra cómo se puede modificar un servicio autohospedado para que sea reconocible.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

Debe agregarse una instancia ServiceDiscoveryBehavior a una descripción del servicio para que sea descubrible. Se debe agregar una DiscoveryEndpoint instancia al host de servicio para indicar al servicio dónde escuchar las solicitudes de detección. En este ejemplo, se agrega UdpDiscoveryEndpoint (que se deriva de DiscoveryEndpoint) para especificar que el servicio debe realizar escuchas de solicitudes de detección en el transporte multidifusión de UDP. UdpDiscoveryEndpoint se utiliza para la detección ad hoc porque todos los mensajes se envían en modo de multidifusión.

Anuncio

De forma predeterminada, la publicación del servicio no envía mensajes de anuncio. El servicio debe configurarse para enviar mensajes de anuncio. Esto proporciona una flexibilidad adicional a los escritores del servicio, ya que pueden anunciar el servicio de forma independiente de la realización de escuchas de mensajes de detección. El anuncio de servicio también se puede usar como mecanismo de registro de los servicios con un proxy de detección u otros registros del servicio. El código siguiente muestra cómo configurar un servicio para enviar mensajes de anuncio a través de un enlace UDP.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    ServiceDiscoveryBehavior discoveryBehavior = new ServiceDiscoveryBehavior();
    serviceHost.Description.Behaviors.Add(discoveryBehavior);

    // Send announcements on UDP multicast transport
    discoveryBehavior.AnnouncementEndpoints.Add(
      new UdpAnnouncementEndpoint());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.Description.Endpoints.Add(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

Detección de servicios

Una aplicación cliente puede usar la DiscoveryClient clase para buscar servicios. El desarrollador crea una instancia de la clase DiscoveryClient que pasa un punto de conexión de detección que especifica dónde se deben enviar los mensajes Probe o Resolve. A continuación, el cliente llama a Find que especifica criterios de búsqueda dentro de una instancia de FindCriteria. Si se encuentran servicios coincidentes, Find devuelve una colección de EndpointDiscoveryMetadata. En el código siguiente se muestra cómo llamar al Find método y, a continuación, conectarse a un servicio detectado.

class Client
{
    static EndpointAddress serviceAddress;
  
    static void Main()
    {  
        if (FindService())
        {
            InvokeService();
        }
    }  
  
    // ** DISCOVERY ** //  
    static bool FindService()  
    {  
        Console.WriteLine("\nFinding Calculator Service ..");  
        DiscoveryClient discoveryClient =
            new DiscoveryClient(new UdpDiscoveryEndpoint());  
  
        Collection<EndpointDiscoveryMetadata> calculatorServices =
            (Collection<EndpointDiscoveryMetadata>)discoveryClient.Find(new FindCriteria(typeof(ICalculator))).Endpoints;  
  
        discoveryClient.Close();  
  
        if (calculatorServices.Count == 0)  
        {  
            Console.WriteLine("\nNo services are found.");  
            return false;  
        }  
        else  
        {  
            serviceAddress = calculatorServices[0].Address;  
            return true;  
        }  
    }  
  
    static void InvokeService()  
    {  
        Console.WriteLine("\nInvoking Calculator Service at {0}\n", serviceAddress);  
  
        // Create a client  
        CalculatorClient client = new CalculatorClient();  
        client.Endpoint.Address = serviceAddress;  
        client.Add(10,3);  
    }
}  

Detección y seguridad de nivel de mensaje

Al usar la seguridad de nivel de mensaje, es necesario especificar un EndpointIdentity en el punto de conexión de descubrimiento de servicios y un EndpointIdentity coincidente en el punto de conexión de descubrimiento de cliente. Para obtener más información sobre la seguridad de nivel de mensaje, consulte Seguridad de mensajes.

Detección y servicios hospedados en web

Para que los servicios WCF puedan detectarse, deben ejecutarse. Los servicios WCF hospedados en IIS o WAS no se ejecutan hasta que IIS/WAS recibe un mensaje enlazado al servicio, por lo que no se pueden detectar de forma predeterminada. Hay dos opciones para hacer que los servicios de Web-Hosted sean reconocibles:

  1. Usar la característica Inicio automático de AppFabric de Windows Server

  2. Usar un proxy de detección para comunicarse en nombre del servicio

AppFabric de Windows Server tiene una característica de inicio automático que permitirá que se inicie un servicio antes de recibir mensajes. Con este conjunto de inicio automático, se puede configurar un servicio hospedado de IIS/WAS para que se pueda detectar. Para obtener más información sobre la característica Inicio automático, consulte Característica de inicio automático de Windows Server AppFabric. Además de activar la característica Inicio automático, debe configurar el servicio para la detección. Para obtener más información, vea Cómo: Agregar Descubrimiento a un Servicio y Cliente WCF ProgramáticamenteConfiguración del Descubrimiento en un Archivo de Configuración.

Se puede usar un proxy de detección para comunicarse en nombre del servicio WCF cuando el servicio no se está ejecutando. El proxy puede escuchar mensajes de sondeo o resolución y responder al cliente. Después, el cliente puede enviar mensajes directamente al servicio. Cuando el cliente envía un mensaje al servicio, se creará una instancia para responder al mensaje. Para obtener más información sobre cómo implementar un proxy de detección, consulte Implementación de un proxy de detección.

Nota:

Para que la detección de WCF funcione correctamente, todas las NIC (controladora de interfaz de red) solo deben tener 1 dirección IP.