Publicar en el servidor de StreamInsight y conectarse a él

 

En un programa cliente de StreamInsight, puede elegir usar un servidor de StreamInsight incrustado en proceso o conectarse a un servidor remoto. En ambos casos, se usa un objeto de servidor para crear una aplicación de StreamInsight y definir entidades como un origen y un receptor de eventos. Para conectarse a una instancia de un servidor remoto, el servidor de StreamInsight hospedado debe exponer la interfaz de capacidad de administración del servicio web.

Conectar a un servidor

Cuando se hospeda en el proceso, el servidor de StreamInsight se crea a través de la siguiente llamada:

Server server = Server.Create(…);  

El cliente de StreamInsight también se puede conectar a un servidor remoto que se ejecute como un proceso independiente. En el ejemplo siguiente, un cliente se conecta a un servidor identificado por una dirección de extremo específica.

Server server = Server.Connect(new System.ServiceModel.EndpointAddress(@"https://localhost/StreamInsight/MyInstance"));  

En este ejemplo se conecta a un servicio StreamInsight instalado con el nombre de instancia "MyInstance". Observe que para conectar con cualquier servidor StreamInsight (un servicio instalado o su aplicación de servidor personalizada), el usuario que se conecta debe estar en el grupo que corresponde a la instancia del servidor. Para obtener más información acerca de este grupo y el servicio StreamInsight, vea Instalación (StreamInsight).

Exponer el extremo del servidor

Para que el método Connect() se ejecute correctamente, el servidor remoto debe exponer su interfaz de capacidad de administración a través de un extremo de servicio Web en el identificador uniforme de recursos (URI) especificado. Por ejemplo, el depurador de flujo de eventos de StreamInsight es una aplicación cliente que, cuando se conecta a un extremo de un servidor activo, puede recuperar información de diagnóstico sobre las consultas y otros objetos en el nivel de servidor o grabar eventos de una consulta en ejecución para su depuración detallada.

Si configuró un servicio de Windows de host de StreamInsight cuando instaló StreamInsight, puede conectarse a ese servicio como servidor remoto. Una aplicación puede exponer la interfaz de capacidad de administración de un servidor de StreamInsight hospedado agregando un extremo de servicio web, tal como se muestra en el siguiente ejemplo. En el ejemplo se supone que existe una instancia de StreamInsight registrada con el nombre "MyInstance".

Server server = Server.Create("MyInstance");  
ServiceHost host = new ServiceHost(server.CreateManagementService());  
host.AddServiceEndpoint(typeof(IManagementService),  
                        new WSHttpBinding(SecurityMode.Message),  
                        "https://localhost:8090/MyStreamInsightServer");  
host.Open();  
...  
host.Close;  

Observe que debe agregar una referencia a Microsoft.ComplexEventProcessing.ManagementService.dll y especificar el espacio de nombres correspondiente para usar Management Service.

StreamInsight usa Windows Communication Foundation (WCF) para su interfaz de servicio web. Una descripción completa de la configuración de WCF está más allá del ámbito de esta documentación, pero debe tener en cuenta los siguientes puntos cuando vaya a exponer el servicio web:

  • El enlace con la URL especificada exige que sea una URL reservada para la cuenta del usuario que ejecuta la aplicación. Si la aplicación StreamInsight no se ejecuta bajo los derechos de administrador, el siguiente comando se debe ejecutar en un shell de comando elevado:

    netsh http add urlacl url=http://+:8090/MyStreamInsightServer user=<domain\userid>  
    

    La reserva de URL a través de netsh siempre exige proporcionar un nombre de puerto. Elija un puerto que aún no se haya usado. Use el siguiente comando para mostrar las URL actualmente reservadas.

    netsh http show urlacl  
    

    Observe que el uso de caracteres comodín de la reserva de direcciones URL afecta al parámetro HostNameComparisonMode del enlace. El modo de coincidencia predeterminado de un enlace es StrongWildcard. Por ejemplo, si desea habilitar el nombre de host coincidente exacto (usando "localhost" en la especificación del extremo del servidor y solo permitiendo clientes locales), debe establecer primero el modo de coincidencia correspondiente:

    WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message);  
    binding.HostNameComparisonMode = HostNameComparisonMode.Exact;  
    host.AddServiceEndpoint(typeof(IManagementService),  
            binding,  
            "https://localhost:8090/MyStreamInsightServer");  
    

    Como cualquier otra propiedad de WCF, esta también se puede especificar en el archivo app.config.

    A continuación, también debe reservar el ámbito de la dirección URL correspondiente usando el comando netsh:

    netsh http add urlacl url=https://localhost:8090/MyStreamInsightServer user=<domain\userid>  
    
  • En el ejemplo anterior, la configuración del extremo se especifica mediante programación. Como alternativa, el extremo se puede configurar a través de un archivo app.config como cualquier otra aplicación basada en WCF. El servicio StreamInsight instalado, por ejemplo, usa este tipo de configuración para cada instancia registrada. El archivo de configuración se puede encontrar en la carpeta de instalación de StreamInsight bajo Host\<instance_name> con el nombre StreamInsightHost.exe.config.

  • En Windows XP y Windows Server 2003, netsh no está disponible. En su lugar, debe instalar las herramientas de soporte de Windows Server 2003 y usar el comando httpcfg desde la "<unidad>:Archivos de programa\Support Tools" para reservar las direcciones URL. Por ejemplo, el comando para reservar una URL de carácter comodín para la cuenta del servicio de red, es:

    httpcfg set urlacl /u http://+:80/StreamInsight/MyStreamInsightServer /a "D:(A;;GX;;;NS)"  
    

A la hora de exponer el servicio Web para conexiones a través de la red, tenga en cuenta la siguiente información específica.

  • El servicio StreamInsight instalado solo permite conexiones locales de forma predeterminada. Cuando deba exponer el servicio web del servicio instalado en máquinas que no sean el host local, debe seguir los pasos descritos anteriormente para:

    1. Cambiar la reserva de dirección URL para el servicio de "localhost" explícito al carácter comodín "+".

    2. Cambiar el nombre del host coincidente del archivo app.config del servicio a StrongWildcard.

  • Al habilitar conexiones remotas, se debe abrir el puerto especificado en el firewall del servidor.

  • Al conectar un cliente a una instancia del servidor remoto en la red usando el nombre de equipo, se usa Kerberos para autenticar en lugar de NTLM al usar la dirección IP. Es decir, el cliente necesita establecer una identidad de nombre principal del usuario (UPN) para el extremo antes de conectar:

    EndpointIdentity ei = EndpointIdentity.CreateUpnIdentity(WindowsIdentity.GetCurrent().Name);  
    EndpointAddress ea = new EndpointAddress(new Uri(@"http://machinename:8090/MyStreamInsightServer"), ei, (AddressHeaderCollection)null);  
    server = Server.Connect(ea);  
    

Consulte la documentación de WCF para obtener más detalles sobre cómo especificar extremos.

Vea también

Supervisar el servidor y las consultas de StreamInsight
Usar el Depurador de flujo de eventos de StreamInsight
Ejemplo integral de adaptador de StreamInsight