情况: 我们有一个运行在服务器上的Web应用程序。这个应用程序需要从其他PC(客户端)获取数据,这些客户端位于不同的网络上。
在客户端的计算机上,有WCF
托管在Windows服务
中,使用其本地的Sql db
。我想让服务器和客户端之间建立双向通信,以便彼此共享数据。数据共享意味着在客户端和服务器之间共享数据表、数据集、字符串等。
问题 :
1) 我无法控制客户端PC上的防火墙、代理、NAT。大多数公司员工PC都有很多网络安全性,例如防火墙阻止ICMP流量和一些端口,某些路由器可能禁用了端口转发等等,客户端可以更改网络位置。虽然我不想在客户端路由器、代理、防火墙上进行任何设置,但在通信期间如何处理客户端的这种问题呢?正如你所知,Skype在这种情况下工作得非常完美。
防火墙经常阻止对客户端的入站连接;可能无法从服务器联系到客户端,它可能在路由器后面使用NAT转换,因此无法在路由器上设置端口转发并禁用一些新的路由器端口转发。
2) 在客户端没有IIS。
我不想允许远程访问客户端PC。
有100多个客户端和一个服务器。一个服务器需要在不同的网络上与许多客户端通信。
3) 一边我的客户端应用程序正在使用窗口应用程序和WCF托管在窗口服务中,另一边在我的服务器上我正在使用Web应用程序。这意味着通信是在桌面PC和Web PC之间进行的,这是一个问题。
如果两者都使用Web应用程序,则建立双向通信就不是问题,因为我知道WEBRTC适合那里,哈哈。
我已经测试过的技术,并发现了问题
WSDualHttpBinding: 如果客户端在NAT后面,则无法工作。点击此处了解详情。
MSMQ : 如果客户端超过1个,则是糟糕的技术,而且还会出现性能问题,因为它使用RAM内存。点击此处了解详情。
Xsocket: 如果客户端的防火墙阻止ICMP流量,则它也无法工作。点击此处。
WebRTC: 它可以很好地工作,但是它支持Web到Web通信。由于我的客户端侧是win应用程序,因此不适用。
Socket.io: 它需要设置node.js和许多其他东西,难以实现,因为我需要在现有应用程序上实现,而不是创建新的应用程序。
C# Socket Program: 如果客户端在NAT后面,则无法工作。请参阅详细信息。
Service Bus relay: 即使进行测试也不免费。
socketPro: 我研究了它,发现它很好,但是在谷歌上找不到任何正确的示例,以便我可以测试它。
Genuine Channels: 我在谷歌上找不到任何示例。
让我们看看SignalR问题:服务器端运行控制台应用程序,客户端运行两个应用程序,一个是控制台,另一个是Web。当我运行控制台客户端应用程序时,它无法与服务器建立连接,但是当我使用Web客户端应用程序时,它可以正常工作。示例链接在这里:SignalR双向通信。我不明白为什么会这样?
请告诉我处理此情况的最佳、最安全和最快速的方法是什么?我应该使用什么方法?