¿Cómo establecer una comunicación bidireccional entre un servidor web y un servidor de sitio?

Estoy planeando un sistema SaaS, que se escribirá en C #, ASP.NET utilizando WCF que tiene dos componentes separados:

  1. En un servidor web IP estático en la nube habrá una aplicación web, común a todos los clientes.
  2. Dentro de la oficina de cada cliente habrá otra aplicación, instalada en un servidor con IIS.

La aplicación del sitio obviamente podrá conectarse a los servicios web publicados en el sitio web. Pero aquí está el problema: también quiero que la aplicación web pueda iniciar una conexión con la aplicación del sitio … y el servidor en el sitio no necesariamente tiene una IP estática. No puedo controlar esto, porque podemos tener cientos de clientes en algún momento en el futuro, y no podemos limitar nuestra saleabilidad insistiendo en que el cliente tenga un servidor con IP fija.

Entonces, ¿cómo hacer esto?

Podría hacer que las aplicaciones del sitio se “registren” en la web cada minuto, para que la aplicación pueda responder con un “mientras esté aquí, haga x, y, z … ” pero eso parece muy poco elegante Además, si estamos hablando de cientos de clientes, no quiero estar bombardeando mi servidor web con todos estos “¡Hola!” Mensajes si no son realmente requeridos.

¿Hay alguna manera mejor?

WCF? Aquí vamos:

  • Utilice un enfoque basado en mensajes (mensaje de intercambio, no hay llamadas de método con estado).
  • Los clientes se conectan al servidor. Establezca una CONEXIÓN DE DOS VÍAS basada en HTTP. De esta manera el servidor puede volver a llamar a los clientes conectados. Esto es material estándar de WCF y funciona bien a través de NAT con la versión 4 de .NET framework.

Voila En caso de desconexión, el cliente puede volver a conectarse, identificarse y obtener los mensajes pendientes.

La “comunicación push” de IIRC se realiza al permitir que el cliente realice una solicitud HTTP con un tiempo de espera indefinido. Entonces el servidor responde cuando tiene algo que decir. Después de la respuesta, el cliente realiza inmediatamente una nueva solicitud.

Funciona de la misma manera que el servidor está haciendo la conexión y requiere muchos menos recursos que el sondeo.

  1. El DNS dynamic es una posibilidad, pero depende de sus clientes.
  2. Si usted crea la aplicación de sitio, solo tiene que ponerse en contacto con el servidor web cuando su dirección haya cambiado (o cuando se reinicie el servidor de sitio / aplicación web). Aún así, un corazón de mantener vivo el latido de, digamos, cada 30 minutos. a 1 hora no es una mala idea.

Edición: creo que los servicios SNMP pueden proporcionar la respuesta, pero no soy un experto en redes. Tendrá que hacer algunas excavaciones o hacer una pregunta por separado en stackoverflow.

¿Qué dirías de la tecnología Comet?

Parece que definitivamente necesitará algún tipo de registro en el servidor, entonces podría intentar llamar a las aplicaciones del cliente si necesita trabajar.

En general, las aplicaciones cliente se registran con el servidor cada X segundos; así es como funciona la red de Selenium . Con un hub central con el que se registran los clientes. Cuando el concentrador recibe una solicitud para ejecutar algunas pruebas, pasa los trabajos a los clientes para que los realicen.

Es posible que no necesite el “check in”. El servidor podría intentar llamar a una aplicación cliente registrada hasta que encuentre una disponible. De esta manera, solo el servidor necesitará una dirección estática (podría usar un nombre DNS en lugar de una IP para hacerlo más robusto).

También eche un vistazo a XMPP PubSub . Esta podría ser una forma más robusta y estandarizada de manejar esto.

Al final decidí ir con NetTcpBinding, por las razones que da @Allon Guralnek aquí . Vale la pena leer y leer lo que tiene que decir …