Publicando e conectando ao servidor StreamInsight

Em um aplicativo StreamInsight, você pode optar por inserir o servidor StreamInsight em processo ou conectar-se a um servidor remoto. Em ambos os casos, você usa um objeto de servidor para desenvolver consultas do StreamInsight. Para conectar a uma instância remota, é necessário que ela hospede o servidor StreamInsight e exponha a interface de capacidade de gerenciamento do serviço Web.

Conectando a um servidor

Quando hospedado em processo, o servidor StreamInsight é criado através da seguinte chamada:

    Server server = Server.Create(…);

Outra alternativa é a conexão do aplicativo StreamInsight a um servidor existente que é executado como um processo separado. No exemplo a seguir, um aplicativo cliente conecta-se a um servidor identificado por um endereço de ponto de extremidade específico.

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

Esse exemplo se conecta a um serviço do StreamInsight instalado com o nome de instância "MyInstance". Observe que, para se conectar a um servidor do StreamInsight (um serviço instalado ou seu aplicativo de servidor personalizado), o usuário da conexão deve estar no grupo correspondente à instância do servidor. Para obter mais informações sobre o grupo e o serviço do StreamInsight, consulte Instalação (StreamInsight).

Expondo o ponto de extremidade do servidor

Para que o método Connect() tenha êxito, o servidor deve expor sua interface de capacidade de gerenciamento por meio de um ponto de extremidade do serviço Web no URI (Uniform Resource Identifier) especificado. Por exemplo, o Depurador de Fluxo de Eventos do StreamInsight é um aplicativo cliente que, quando conectado a um ponto de extremidade de um servidor ativo, pode recuperar informações de diagnóstico sobre consultas e outros objetos em nível de servidor ou registrar eventos de uma consulta em execução para depuração adicional.

Um aplicativo pode expor a interface de capacidade de gerenciamento de um servidor StreamInsight hospedado adicionando um ponto de extremidade do serviço Web, conforme mostrado no exemplo a seguir. O exemplo supõe que exista uma instância do StreamInsight registrada chamada "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 você deve adicionar uma referência a Microsoft.ComplexEventProcessing.ManagementService.dll e especificar o namespace correspondente para poder usar o Serviço de Gerenciamento.

StreamInsight usa o WCF (Windows Communication Foundation) para a interface de serviço Web. O escopo desta documentação não inclui uma discussão detalhada da configuração do WCF, mas leva em consideração os seguintes pontos durante a exposição do serviço Web:

  • A associação à URL especificada exige a reserva da URL para a conta de usuário que executa o aplicativo. Se o aplicativo StreamInsight não for executado com os direitos de administrador, o seguinte comando deverá ser executado em um shell de comandos elevado:

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

    A reserva da URL por meio de netsh sempre exige um nome de porta. Escolha uma porta que ainda não tenha sido usada. Use o comando a seguir para listar as URLs reservadas no momento.

    netsh http show urlacl
    

    Observe que o uso de curingas na reserva de URL tem um impacto no parâmetro HostNameComparisonMode da associação. O modo correspondente padrão de uma associação é StrongWildcard. Se, por exemplo, você se quiser habilitar a correspondência exata de nome de host (usando "localhost" na especificação de ponto de extremidade do e permitindo que somente clientes locais se conectem), você deverá primeiro definir o modo de correspondência associado:

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

    Como qualquer outra propriedade WCF, essa também pode ser especificada no app.config.

    Em seguida, você também deve reservar o escopo da URL correspondente usando o comando netsh:

    netsh http add urlacl url=https://localhost:8090/MyStreamInsightServer user=<domain\userid>
    
  • No exemplo anterior, a configuração do ponto de extremidade é especificada programaticamente. Como alternativa, o ponto de extremidade pode ser configurado por meio de um arquivo app.config, como qualquer outro aplicativo baseado no WCF. O serviço do StreamInsight instalado, por exemplo, usa essa configuração declarativa para cada instância registrada. O arquivo de configuração se encontra na pasta de instalação do StreamInsight, em Host \<instance_name>, denominado StreamInsightHost.exe.config.

  • No Microsoft Windows XP e no Windows Server 2003, netsh não está disponível. Em seu lugar, você deve instalar as ferramentas de suporte do Windows Server 2003 e usar o comando httpcfg em "<unidade>:Arquivos de Programas\Ferramentas de Suporte\" para reservar URLs. Por exemplo, o comando para reservar uma URL curinga para a conta de serviço de rede é:

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

Ao expor o serviço Web para conexões em toda a rede, leve em consideração as informações específicas a seguir.

  • O serviço StreamInsight instalado só permite conexões locais por padrão. Quando você precisar expor o serviço Web do serviço instalado a computadores que não sejam o localhost, deverá seguir as etapas descritas acima para:

    1. Alterar a reserva de URL para o serviço do "localhost" explícito para o curinga "+".

    2. Alterar a correspondência de nome de host no app.config do serviço para StrongWildcard.

  • Durante a habilitação de conexões remotas, a porta especificada deve ser aberta no firewall do servidor.

  • Durante a conexão de um cliente com uma instância de servidor remota na rede usando o nome do computador, o Kerberos é usado na autenticação no lugar de NTLM quando é usado o endereço IP. Isso significa que o cliente precisa definir uma identidade UPN para o ponto de extremidade antes da conexão:

    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 a documentação do WCF para obter mais detalhes sobre a especificação de pontos de extremidade.

Consulte também

Conceitos

Monitorando o servidor StreamInsight e as consultas

Usando o depurador do fluxo de eventos do StreamInsight

Exemplo ponta a ponta do StreamInsight

Histórico de alterações

Conteúdo atualizado

Corrigidos os exemplos de código e adicionadas novas informações na seção "Expondo o ponto de extremidade do servidor".