如何在Web服务器和站点服务器之间建立双向通信?

我正在计划一个SaaS系统,用C#编写,ASP.NET使用WCF,它有两个独立的组件:

  1. 在云中的静态IP Web服务器上将是一个Web应用程序,对所有客户端都是通用的。
  2. 在每个客户的办公室内将是另一个应用程序,安装在带IIS的服务器上。

该站点应用程序显然可以连接到网站上发布的Web服务。 但这就是问题 – 我还希望网络应用程序能够启动与站点应用程序的连接……并且现场服务器可能不一定具有静态IP。 我无法控制这一点,因为我们将来可能会有数百个客户,我们不能通过坚持客户拥有固定IP的服务器来限制我们的销售能力。

那么,怎么做呢?

我可以让网站应用程序每分钟左右“检入”一次,让网络应用程序有可能回复“当你在这里时,请做x,y,z …… ”但似乎非常不优雅。 此外,如果我们谈论数百个客户,我不想用所有这些“嗨那里”轰炸我的网络服务器! 消息,如果它们实际上不是必需的。

有没有更好的办法?

WCF? 开始了:

  • 使用基于消息的方法(交换消息,无状态方法调用)。
  • 客户端连接到服务器。 建立基于HTTP的双向连接。 这样服务器就可以回调连接的客户端。 这是标准的WCF,通过NAT与.NET框架的第4版很好地工作。

瞧。 如果断开连接,客户端可以重新连接,重新识别自己并获取待处理的消息。

IIRC“推送通信”是通过让客户端执行具有不确定超时的HTTP请求来完成的。 然后服务器在他有话要说时回应。 在响应之后,客户端立即发出新请求。

它的工作方式与服务器建立连接的方式相同,并且比轮询使用的资源少得多。

  1. 动态DNS是一种可能性,但取决于您的客户/客户。
  2. 如果您创建了站点应用程序,则只需在其地址发生更改时(或重新启动站点服务器/ Web应用程序时)联系Web服务器。 仍然是,每30分钟保持心脏跳动。 到1小时不是一个坏主意。

编辑:我认为SNMP服务可能提供答案,但我不是网络专家。 你必须在stackoverflow上做一些挖掘或问一个单独的问题。

您对Comet技术有什么看法?

听起来你肯定需要在服务器上使用某种注册表,如果它需要工作,它可能会尝试调用客户端应用程序。

通常,客户端应用程序每X秒检查一次服务器 – 这就是Selenium网格的工作原理。 有一个中心枢纽,客户注册。 当集线器收到运行某些测试的请求时,它会将作业传递给客户端以执行。

您可能不需要“登记入住”。 服务器可能只是尝试呼叫已注册的客户端应用程序,直到找到可用的应用程序。这样只有服务器才需要静态地址(可以使用DNS名称而不是IP来使其更健壮)。

另请查看XMPP PubSub 。 这可能是一种更强大和标准化的方法来处理这个问题。

最后我决定使用NetTcpBinding,原因是@Allon Guralnek 在这里给出了最好的理由。 值得点击并阅读他要说的内容……