Frage

Siehe auch Wie informiert ein WCF -Server einen WCF -Client über Änderungen?(Bessere Lösung als einfache Umfragen, z. B.Kommentar oder lange Umfrage)

Ich muss Push-Technologie mit WCF über Client-Firewalls verwenden.Dies muss ein häufiges Problem sein, und ich weiß mit Sicherheit, dass es theoretisch funktioniert (siehe Links unten), aber es ist mir nicht gelungen, es zum Laufen zu bringen, und ich konnte kein Codebeispiel finden, das es demonstriert.

Anforderungen:

  • WCF
  • Clients stellen über TCP-Port 80 (netTcpBinding) eine Verbindung zum Server her.
  • Der Server sendet Informationen in unregelmäßigen Abständen (1 Minute bis mehrere Stunden) zurück.
  • Benutzer sollten ihre Firewalls nicht konfigurieren müssen, Server-Pushs müssen Firewalls passieren, bei denen alle eingehenden Ports geschlossen sind.Hierfür ist TCP-Duplex auf derselben Verbindung erforderlich, eine doppelte Bindung funktioniert nicht, da ein Port auf der Client-Firewall geöffnet werden muss.
  • Clients senden in regelmäßigen Abständen (vielleicht alle 15 Minuten) Heartbeats an den Server, damit der Server weiß, dass der Client noch aktiv ist.
  • Server ist IIS7 mit WAS.

Die Lösung scheint duplex netTcpBinding zu sein.Basierend auf diesen Informationen:

WCF durch Firewalls und NATs

Verbindungen in IIS offen halten

Aber ich habe noch kein Codebeispiel gefunden, das funktioniert.Ich habe erfolglos versucht, die Beispiele „Duplex“ und „TcpActivation“ aus den WCF-Beispielen von Microsoft zu kombinieren.Kann mir bitte jemand Beispielcode zeigen, der funktioniert, oder eine kleine Beispiel-App erstellen?Vielen Dank!

War es hilfreich?

Lösung

Ich habe ein paar Lösungen gefunden:

ZeroC-Eis GPL mit kommerzieller Option.Habe es nur schnell getestet.Sieht leistungsfähiger aus als .NET Remoting und wird sehr aktiv weiterentwickelt.

RemObjects Kommerzielle, aktive Entwicklung, unterstützt alles, scheint aber nicht über alle erweiterten Funktionen zu verfügen, die GenuineChannels verwenden.

Echte Kanäle.Es nutzt Remoting mit vielen netten Zusatzfunktionen. Das Wichtigste ist, dass es über NATs funktioniert, ohne dass die Client-Firewall geöffnet werden muss.Scheint leider sehr tot zu sein.

Eine andere Lösung besteht laut diesem Artikel darin, Streaming mit IIS zu verwenden: Verbindungen in IIS offen halten

Der Client stellt die erste Verbindung (http mit IIS6, tcp mit IIS7) zum Server an Port 80 her, die Verbindung wird dann mit einer Streaming-Antwort offen gehalten, die nie endet.

Ich hatte keine Zeit, damit zu experimentieren, und ich habe kein Beispiel gefunden, das besagt, dass es speziell das Firewall-Problem löst, aber hier ist ein hervorragendes Beispiel, das wahrscheinlich funktioniert: XML-Streaming.

Andere Tipps

Haben Sie versucht, Folgendes anzusehen: http://www.codeproject.com/KB/WCF/WCF_Duplex_UI_Threads.aspx

Können Sie Beispiele dafür nennen, was Sie bereits versucht haben?Mit Details zu Firewalls etc., Fehlermeldungen?

Wenn sowohl Client als auch Server direkt angesprochen werden können und Firewalls kein Problem darstellen, haben Sie darüber nachgedacht, Clients die Registrierung einer URL zu ermöglichen, die einen unterstützten Vertrag bereitstellt.Der Server kann diesen Dienst dann jederzeit aufrufen, ohne dass eine lang laufende (aber größtenteils inaktive) Verbindung hergestellt werden muss, er vermeidet die Notwendigkeit von Herzschlägen und kann über Sitzungen/Verbindungen hinweg widerstandsfähig gemacht werden.

Bei den meisten Firewall-Setups wird die TCP-Verbindung von der Firewall unterbrochen, wenn sie inaktiv ist, um Ressourcen zu sparen.Das Leerlauf-Timeout können Sie wahrscheinlich nicht kontrollieren.Einige werden sie abreißen, wenn sie inaktiv sind und eine Ressourcengrenze erreicht wird.

In den meisten Unternehmensumgebungen ist es ohnehin nicht möglich, dass Maschinen eine ausgehende TCP-Verbindung herstellen.

Außerdem bedeutet die Verwendung dieses Mechanismus, dass Skalierungsprobleme auftreten.Ich denke, eine zuverlässigere Lösung besteht darin, Informationen in die Warteschlange zu stellen und Ihre Kunden regelmäßig danach fragen zu lassen.Nutzen Sie nach Möglichkeit Caching, damit eine nachfolgende Client-Abfrage die zwischengespeicherten Daten aus dem Proxy-Cache des Kunden erhält, sofern dieser einen solchen verwendet.

Wenn Sie Daten zeitnah übertragen müssen, in Sekundenschnelle (d. h.Finanzdienstleistungen), dann ziehen Sie eine Messaging-Infrastruktur wie einen NServiceBus-Verteiler auf der Clientseite in Betracht, aber dafür ist eine Installation durch den Kunden erforderlich ...

Haben Sie schon versucht, Toredo zu verwenden?Nachdem ich gelesen habe, dass es dort erscheint, ist die Einrichtung für einen Benutzer wahrscheinlich zu kompliziert.

Ich habe das Szenario, von dem Sie sprechen, nicht ausprobiert, daher kann ich Ihnen leider nicht viel weiterhelfen.Wenn Sie lediglich die Client-Firewall umgehen müssen, sollten Sie einen Blick darauf werfen dieser Beitrag.

Viel Glück.

Hast du das schon probiert?DuplexHttpBinding

Es verwendet eine intelligente Abfragetechnik, die als benutzerdefinierte WCF-Bindung gekapselt ist.Es sollte also sofort funktionieren.

Sie können die folgende Änderung im Client vornehmen, um auf dem Client mit aktivierter Firewall auf den Duplex-Webdienst zuzugreifen.

  • WebHttp-Option unter Firewall -> Erweitert -> Einstellungen (der Netzwerkverbindungseinstellungen) -> Webserver (Http) aktivieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top