我在LAN服务器上安装了我的主应用程序(ServerApp
)(位于防火墙后面,因此服务器可以访问互联网但无法直接从互联网访问(无静态IP)),以及我的PC上的监控应用程序(MonitorApp
)位于局域网外部并直接连接到Internet。
ServerApp
应及时向MonitorApp
发送一些通知事件(基本上是一些统计信息)(每1-2秒)。
性能是此应用程序的关键因素,因此我必须尽一切可能减少流量。
MonitorApp
)看到服务器。MonitorApp
这样的应用程序,但也能够向ServerApp
发送命令(为了澄清,我们将其命名为ControlApp
),我应该使用其他方法吗? 为多个问题道歉。谢谢你。
答案 0 :(得分: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 timeout。
双工通信也不是解决方案,因为ServerApp必须再次建立连接 - 再次出现超时问题,而且双工通信是会话性的,需要关注不活动超时等。
您的问题可以通过Azure服务提供的中继轻松解决,但您必须为此付费。