【问题标题】:WCF architecture: using callbacks, events, 2x service-client?WCF 架构:使用回调、事件、2x 服务客户端?
【发布时间】:2011-07-02 18:19:48
【问题描述】:

我的主应用程序(ServerApp)安装在 LAN 服务器上(位于防火墙后面,因此服务器可以访问 Internet,但不能直接从 Internet 访问(无静态 IP))和监控应用程序(MonitorApp)在我的电脑上,它在局域网之外并直接连接到互联网。

ServerApp 应该及时(每 1-2 秒)向MonitorApp 发送一些通知事件(基本上是一些统计信息)。

性能是这个应用程序的一个关键因素,所以我必须尽一切可能减少流量。

  • 如何在这两个应用程序之间建立连接?我可以在这种情况下使用 WCF 回调吗? (考虑到我无法直接从我的MonitorApp 看到服务器)。
  • 在使用 WCF 服务和客户端在另一侧使用另一个 WCF 服务和客户端而不是 WCF 回调合同时,是否存在性能偏好。我猜一件事是我必须在双方都使用 2x 客户端服务,因为我必须使用基本的 HttpBinding 才能通过防火墙。
  • 关于如何实施它的任何一般指南?
  • 如果我打算编写像MonitorApp 这样的应用程序,但也能够向ServerApp 发送命令(为了澄清,我们将其命名为ControlApp),我应该使用其他方法吗?

对多个问题表示歉意。谢谢。

【问题讨论】:

    标签: architecture wcf wcf-client performance


    【解决方案1】:

    看起来很难实现解决方案。

    我已经安装了我的主应用程序 (ServerApp) 在 LAN 服务器上(即 在防火墙后面,因此服务器可以 访问互联网,但它不能 直接从互联网访问(否 静态IP))

    基于此,应该清楚服务器无法托管服务,因为您将无法从 LAN 外部访问它。因此,除非您的 ServerApp 连接到 MonitorApp 中托管的服务,或者在防火墙上配置了某些端口转发,否则将无法实现。

    对我来说,正确的设计是 ServiceApp 托管一个可以提供监控数据的服务和用于发布命令的第二个服务。在您的情况下,这是不可能的。您可以通过在 MonitorApp 中托管服务来部分解决监控:

    您可以像这样公开服务合同

    [ServiceContract]
    public interface MonitoringAppContract
    {
      [OperationContract(IsOneWay=true)]
      void SendMonitoringData(MonitoringData data);
    }
    

    ServerApp会定时调用这个操作,将监控数据传给MonitorApp。由于一种方式调用,它不会被 MonitorApp 上的数据处理阻塞,但也不会收到有关异常的通知。这里的问题是 MonitorApp 上暴露的 WCF 服务必须可用,否则 ServerApp 将等待 Open 超时。

    双工通信也不是解决方案,因为 ServerApp 将不得不再次建立连接 - 再次存在超时问题,而且双工通信是会话式的,它需要其他注意不活动超时等。

    您的问题可以通过 Azure 服务提供的中继轻松解决,但您必须为此付费。

    【讨论】:

    • 谢谢拉迪斯拉夫。所以,即使我使用的是 BasicHttpBinding,我也无法在 ServerApp 上托管服务?
    • @Kamyar:您写道,您的服务器无法从 Internet 访问。在这种情况下,任何绑定都不会帮助您。但即使服务器不可直接访问,网络设备也可以配置为将请求路由到服务器。
    猜你喜欢
    • 2012-07-11
    • 2023-03-27
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多