WCF push to client through firewall?

Sire picture Sire · Aug 22, 2008 · Viewed 11.7k times · Source

See also How does a WCF server inform a WCF client about changes? (Better solution then simple polling, e.g. Coment or long polling)

I need to use push-technology with WCF through client firewalls. This must be a common problem, and I know for a fact it works in theory (see links below), but I have failed to get it working, and I haven't been able to find a code sample that demonstrates it.

Requirements:

  • WCF
  • Clients connects to server through tcp port 80 (netTcpBinding).
  • Server pushes back information at irregular intervals (1 min to several hours).
  • Users should not have to configure their firewalls, server pushes must pass through firewalls that have all inbound ports closed. TCP duplex on the same connection is needed for this, a dual binding does not work since a port has to be opened on the client firewall.
  • Clients sends heartbeats to server at regular intervals (perhaps every 15 mins) so server knows client is still alive.
  • Server is IIS7 with WAS.

The solution seems to be duplex netTcpBinding. Based on this information:

WCF through firewalls and NATs

Keeping connections open in IIS

But I have yet to find a code sample that works.. I've tried combining the "Duplex" and "TcpActivation" samples from Microsoft's WCF Samples without any luck. Please can someone point me to example code that works, or build a small sample app. Thanks a lot!

Answer

Sire picture Sire · Oct 15, 2008

I've found a couple of solutions:

ZeroC Ice GPL with a commercial option. Have only tested quickly. Looks more powerful than .NET Remoting and is very actively developed.

RemObjects Commercial, active development, supports everything but does not seem to have all the more advanced features that GenuineChannels use.

GenuineChannels. It uses remoting with a lot of nice added features, the most important one being it works through NATs without the need to open the client firewall. Unfortunately seems to be very dead.

Another solution is to use streaming with IIS, according to this article: Keeping connections open in IIS

The client makes the first connection (http with IIS6, tcp with IIS7) to the server at port 80, the connection is then kept open with a streaming response that never ends.

I haven't had the time to experiment with this, and I haven't found a sample that says it specifically solves the firewall-problem, but here's an excellent sample that probably works: Streaming XML.