Criterios de búsqueda personalizados
El ejemplo de CustomFindCriteria muestra cómo crear una coincidencia de ámbito personalizada mediante la lógica y el procedimiento para implementar un servicio de detección personalizado. Los clientes utilizan la funcionalidad de concordancia de ámbito personalizada para refinar y seguir usando la funcionalidad de búsqueda proporcionada por la detección WCF. El escenario que abarca este ejemplo es el siguiente:
Un cliente busca un servicio de calculadora.
Para refinar su búsqueda, el cliente debe utilizar una regla de concordancia de ámbito personalizada.
Según esta regla, un servicio responde al cliente si su extremo coincide con cualquiera de los ámbitos especificados por el cliente.
Muestra
Crear un servicio de descarga personalizado.
Implementar una coincidencia del ámbito personalizada por algoritmo.
Debate
El cliente busca los criterios de coincidencia de tipos "OR". Un servicio responde si los ámbitos de sus puntos de conexión coinciden con alguno de los ámbitos que proporciona el cliente. En este caso, el cliente busca un servicio de calculadora que tenga cualquiera de los ámbitos de la siguiente lista:
net.tcp://Microsoft.Samples.Discovery/RedmondLocation
net.tcp://Microsoft.Samples.Discovery/SeattleLocation
net.tcp://Microsoft.Samples.Discovery/PortlandLocation
Para lograr esto, el cliente dirige los servicios para utilizar una regla de concordancia de ámbito personalizada pasando una coincidencia de ámbito personalizada a través de URI. Para facilitar la coincidencia de ámbito personalizada, el servicio debe utilizar un servicio de descarga personalizado que entiende la regla de coincidencia de ámbito personalizada e implemente la lógica de coincidencia asociada.
En el proyecto de cliente, abra el archivo Program.cs. Observe que el campo ScopeMatchBy
del objeto FindCriteria
está establecido en un URI concreto. Este identificador se envía al servicio. Si el servicio no entiende esta regla, omitirá la solicitud de la búsqueda del cliente.
Abra el proyecto de servicio. Se utilizan tres archivos para implementar el Servicio de descarga personalizado:
AsyncResult.cs: es la implementación del
AsyncResult
, que necesitan los métodos de detección.CustomDiscoveryService.cs: este archivo implementa el servicio de detección personalizado. La implementación extiende la clase DiscoveryService e invalida los métodos necesarios. Observe la implementación del método OnBeginFind. El método comprueba si el cliente especificó la coincidencia de ámbito personalizada por regla. Se trata del mismo URI personalizado que el cliente especificó previamente. Si se especifica la regla personalizada, se sigue la ruta de acceso al código que implementa la lógica de coincidencia "OR".
Esta lógica personalizada pasa por todos los ámbitos de cada uno de los puntos de conexión que el servicio tiene. Si alguno de los ámbitos del punto de conexión coincide con alguno de los ámbitos proporcionados por el cliente, el servicio de descarga agrega ese punto de conexión a la respuesta que se devuelve al cliente.
CustomDiscoveryExtension.cs: el último paso para implementar el servicio de detección consiste en conectar esta implementación del servicio de detección personalizado al host de servicios. La clase del asistente que se utiliza aquí es la clase
CustomDiscoveryExtension
. Esta clase extiende la clase DiscoveryServiceExtension. El usuario debe invalidar el método GetDiscoveryService. En este caso, el método devuelve una instancia del servicio de detección personalizado que se creó antes.PublishedEndpoints
es ReadOnlyCollection<T> que contiene todos los extremos de aplicación que se agregan a ServiceHost. El servicio de detección personalizado lo utiliza para rellenar su lista interna. El usuario puede agregar también otros metadatos de punto de conexión.
Por último, abra Program.cs. Observe que tanto ServiceDiscoveryBehavior como CustomDiscoveryExtension
se agregan al host. Una vez hecho esto, si el host tiene un punto de conexión sobre el que recibir los mensajes de detección, la aplicación puede utilizar el servicio de detección personalizado.
Observe que el cliente puede encontrar el servicio sin conocer su dirección.
Configurar, compilar y ejecutar el ejemplo
Abra la solución que contiene el proyecto.
Compile el proyecto.
Ejecute la aplicación de servicio.
Ejecute la aplicación cliente.