2008-08-22 20 views
7

Ver también How does a WCF server inform a WCF client about changes? (Better solution then simple polling, e.g. Coment or long polling)WCF push to client through firewall?

necesito utilizar la tecnología push-con WCF a través de cortafuegos cliente. Este debe ser un problema común, y sé con certeza que funciona en teoría (ver los enlaces a continuación), pero no lo he conseguido, y no he podido encontrar una muestra de código que lo demuestre.

Requisitos:

  • WCF
  • clientes se conecta al servidor a través del puerto TCP 80 (netTcpBinding).
  • El servidor restituye la información a intervalos irregulares (de 1 minuto a varias horas).
  • Los usuarios no deberían tener que configurar sus firewalls, los servidores deben pasar a través de firewalls que tienen todos los puertos entrantes cerrados. Para esto se necesita duplex TCP en la misma conexión, una vinculación dual no funciona ya que se debe abrir un puerto en el firewall del cliente.
  • Los clientes envían heartbeats al servidor a intervalos regulares (quizás cada 15 minutos) para que el servidor sepa que el cliente aún está activo.
  • El servidor es IIS7 con WAS.

La solución parece ser duplex netTcpBinding. Sobre la base de esta información:

WCF through firewalls and NATs

Keeping connections open in IIS

Pero todavía tengo que encontrar un ejemplo de código que funciona .. He intentado combinar el "Duplex" y "muestras" de TcpActivation muestras WCF de Microsoft sin suerte Por favor, alguien me puede indicar un código de ejemplo que funcione, o crear una pequeña aplicación de muestra. ¡Muchas gracias!

+1

¿Está encontrando ningún tipo de excepciones? ¿Qué es exactamente lo que no está funcionando? – jrista

Respuesta

3

he encontrado un par de soluciones:

ZeroC Ice GPL con una opción comercial. Solo han probado rápidamente. Parece más poderoso que .NET Remoting y se desarrolla muy activamente.

RemObjects El desarrollo comercial, activo, es compatible con todo, pero no parece tener todas las características más avanzadas que utiliza GenuineChannels.

GenuineChannels. Utiliza la comunicación remota con muchas características adicionales, la más importante es que funciona a través de NAT sin la necesidad de abrir el firewall del cliente. Lamentablemente parece estar muy muerto.

Otra solución es utilizar el streaming con IIS, de acuerdo con este artículo: Keeping connections open in IIS

El cliente realiza la primera conexión (http con IIS6, tcp con IIS7) al servidor en el puerto 80, se mantiene entonces la conexión abrir con una respuesta de transmisión que nunca termina.

No he tenido tiempo de experimentar con esto, y no he encontrado una muestra que diga que resuelve específicamente el problema del firewall, pero aquí hay una muestra excelente que probablemente funcione: Streaming XML.

+0

Debe tener mucho cuidado cuando mantiene las conexiones abiertas en IIS: puede quedarse sin subprocesos de trabajo (y rápido). Le recomiendo que lea en IAsyncHttpHandler, y cómo obtener la misma funcionalidad de WCF. En el peor, es posible que tengas que sondear. –

1

En la mayoría de las configuraciones de cortafuegos, la conexión TCP será derribada por el cortafuegos si está inactiva para conservar los recursos. El tiempo de espera inactivo probablemente no sea algo que pueda controlar. Algunos los derribarán si están inactivos y se está alcanzando un límite de recursos.

La mayoría de los entornos corporativos no permitirán que ninguna máquina realice una conexión TCP de salida de todos modos.

Además, el uso de este mecanismo significa que tendrá problemas de escala. Creo que una solución más confiable es poner en cola la información y hacer que sus clientes hagan encuestas regularmente. Si es posible, utilice el almacenamiento en caché de modo que una encuesta de cliente posterior obtenga los datos almacenados en caché del caché de proxy del cliente, si es que están usando uno.

Si tiene que enviar datos oportunamente, en terrenos secundarios (es decir, servicios financieros), considere alguna infraestructura de mensajería como un distribuidor NServiceBus en el lado del cliente, pero eso requerirá una instalación del cliente ...

¿Has intentado utilizar Toredo? Después de leer que aparecería allí, es demasiado complicado para que el usuario lo configure.

1

No he probado el escenario del que hablas así que no puedo ser de mucha ayuda, lo siento. Si todo lo que necesita para omitir es el firewall del cliente, es posible que desee consultar this post.

Buena suerte.

2

Ha intentado mirar: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

¿Puede dar ejemplos de lo que ya ha intentado? Con detalles de firewalls, etc., mensajes de error?

Si el cliente y el servidor se pueden direccionar directamente y los firewalls no son un problema, ha considerado permitir que los clientes registren una URL que proporciona un contrato compatible. El servidor puede llamar a este servicio siempre que lo necesite, sin la necesidad de establecer una conexión de larga ejecución (pero principalmente inactiva), evita la necesidad de latidos cardíacos y puede hacerse resistente a través de sesiones/conexiones.

+0

Sí, no funciona a través de un firewall. – Sire

1

¿Has probado este? DuplexHttpBinding

Está utilizando la técnica de sondeo inteligente encapsulada como enlace WCF personalizado. Por lo tanto, debería funcionar de la caja.

-1

Puede hacer los siguientes cambios en el cliente para acceder al servicio web dúplex en el cliente habilitado para Firewall. WebHttp opción

  • Conjunto comprobado en el Firewall -> Avanzadas -> Configuración (Red de Ajuste conexión) -> Servidor web (HTTP)
+0

Hacer un cambio en el firewall de los clientes no es una opción. Y pueden tener un firewall de hardware, en cuyo caso falla de todos modos. – Sire