发布到和连接到 StreamInsight 服务器

在 StreamInsight 应用程序中,您可以选择嵌入 StreamInsight 服务器进程内或者连接到远程服务器。在这两种情况下,您都可以使用服务器对象来开发 StreamInsight 查询。为了连接到某一远程实例,该实例必须承载 StreamInsight 服务器并且公开 Web 服务管理接口。

连接到服务器

在进程内承载时,StreamInsight 服务器通过以下调用创建:

    Server server = Server.Create(…);

StreamInsight 应用程序也可以连接到作为单独进程运行的现有服务器。在下面的示例中,客户端应用程序连接到特定的端点地址标识的服务器。

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

此示例连接到实例名称为“MyInstance”的已安装 StreamInsight 服务。请注意,为了连接到任何 StreamInsight 服务器(已安装的服务或者您的自定义服务器应用程序),连接用户必须处于与服务器实例相对应的组中。有关此组和 StreamInsight 服务的详细信息,请参阅安装 (StreamInsight)

公开服务器端点

为使 Connect() 方法可以成功,服务器必须通过位于给定统一资源标识符 (URI) 的 Web 服务端点公开其管理接口。例如,StreamInsight 事件流调试器是一个客户端应用程序,在连接到活动服务器的某一端点时,该调试器可检索与查询和其他服务器级别对象有关的诊断信息,或者记录来自正运行的查询的事件以便进一步调试。

应用程序可通过添加下例中所示的 Web 服务端点,公开承载的 StreamInsight 服务器的管理接口。该示例假定存在名为“MyInstance”的注册的 StreamInsight 实例。

    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;

请注意,您必须添加对 Microsoft.ComplexEventProcessing.ManagementService.dll 的引用并且指定相应的命名空间,以便使用管理服务。

StreamInsight 使用 Windows Communication Foundation (WCF) 来用于其 Web 服务接口。有关 WCF 配置的全面论述不属于本文档的讨论范围,但在公开 Web 服务时以下几点需要注意:

  • 绑定到指定的 URL 要求为执行应用程序的用户帐户保留此 URL。如果没有在管理员权限下执行 StreamInsight 应用程序,则必须在提升的命令 Shell 中运行以下命令:

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

    通过 netsh 的 URL 保留项始终要求提供端口名称。请选择尚未使用的端口。使用以下命令可以列出当前保留的 URL。

    netsh http show urlacl
    

    请注意,在 URL 保留项中使用通配符会影响绑定中的 HostNameComparisonMode 参数。绑定的默认匹配模式是 StrongWildcard。例如,如果您想要启用精确主机名匹配(在指定服务器的端点时使用“localhost”,并且仅允许本地客户端进行连接),则必须首先设置相应的匹配模式:

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

    与任何其他 WCF 属性相似,也可以在 app.config 中指定此项。

    然后,您还必须通过使用 netsh 命令保留相应的 URL 作用域:

    netsh http add urlacl url=https://localhost:8090/MyStreamInsightServer user=<domain\userid>
    
  • 在上例中,通过编程方式指定端点配置。或者,可以像基于 WCF 的任何其他应用程序一样,通过 app.config 文件配置端点。例如,安装的 StreamInsight 服务将此类声明性配置用于每个注册的实例。可在 Host\<instance_name> 下的 StreamInsight 安装文件夹中找到此配置文件,此配置文件名为 StreamInsightHost.exe.config。

  • 在 Windows XP 和 Windows Server 2003 上,netsh 不可用。您而是必须安装 Windows Server 2003 支持工具,并且从“<驱动器>:Program Files\Support Tools\”使用 httpcfg 命令来保留 URL。例如,用于为网络服务帐户保留通配符 URL 的命令是:

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

在为跨网络的连接公开 Web 服务时,考虑以下具体要求。

  • 默认情况下,已安装的 StreamInsight 服务仅允许本地连接。在您必须将已安装服务的 Web 服务向并非本地主机的其他计算机公开时,您必须按照上述步骤执行:

    1. 将该服务的 URL 保留项从显式的“localhost”更改为通配符“+”。

    2. 将该服务的 app.config 中匹配的主机名更改为 StrongWildcard。

  • 在启用远程连接后,必须在服务器的防火墙中打开指定的端口。

  • 在使用计算机名称跨网络将客户端连接到远程服务器实例时,在使用 IP 地址时使用 Kerberos 进行身份验证,而非使用 NTLM。这意味着客户端需要在连接前为端点设置用户主体名称 (UPN) 标识:

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

有关指定端点的进一步详细信息,请参考 WCF 文档

请参阅

概念

监视 StreamInsight 服务器和查询

使用 StreamInsight 事件流调试器

StreamInsight 端到端示例

更改历史记录

更新的内容

更正了代码示例,并且在“公开服务器端点”部分中添加了新信息。