Silverlight- und Push-Benachrichtigungen
Ich bin erstellen einer Silverlight-2-user-Schnittstelle zu einem entfernten instrument. Es gibt zwei gleichzeitigen Benutzern auf verschiedenen Websites, die die Interaktion mit dem instrument (operator am Gerät und remote-Wissenschaftler) und eine beliebige Anzahl von observer-Benutzer, die nicht mit dieser zu interagieren, Sie nur zu beobachten. Aber immer, wenn einer der beiden aktiven Benutzer ändert sich etwas, müssen diese änderungen werden sofort in die UIs von allen Benutzern, z.B. schwenken oder Zoomen eines Bilds oder hinzufügen von Anmerkungen oder Auswahl der Teil eines Bildes, das hinzufügen von Elementen zu einer Sammlung erscheint in einer listbox. Innerhalb der client-ich nutze sichtbare Sammlungen, welche leicht reflektieren änderungen von diesem Benutzer, aber es ist schwieriger zu sehen, änderungen durch andere Nutzer. Ich kann die Umfrage für änderungen von jedem client, aber so etwas wie push-Benachrichtigungen besser werden würde. Ich habe ausgiebig Gegoogelt Beispiele, aber nichts gefunden, das ist ganz das, was ich brauche. Es gibt alle Arten von Sicherheits-Probleme mit Silverlight Interaktion mit WCF-Diensten bedeutet für viele mögliche Beispiele einfach nicht funktionieren. Ich habe im wesentlichen ausgeführt, aus der Zeit an diesem Projekt und brauchen schnelle Hilfe. Hat jemand eine Vorschlag für ein passendes einfaches Beispiel, das veranschaulicht, wie dies tun? Ich bin ein erfahrener Entwickler, sondern musste mir beibringen, Silverlight und WCF-Dienste, und es ist niemand in meiner Nähe, wer weiß etwas über diese. Sogar tho' ich habe getan, einen fairen Betrag von ASP.NET Arbeit bin ich nicht ein web - /Javascript-guru. Danke.
InformationsquelleAutor der Frage | 2009-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Push-Benachrichtigung unterstützt wird, Silverlight 2 mit dem neuen WCF PollingDuplexHttpBinding unterstützen. Es gibt zwei Baugruppen installiert mit dem Silverlight SDK (eine für Silverlight app, einen für WCF-server).
Ich habe eine einige blog-Beiträge und eine vollständige Beispiel-Applikation, die zeigen, wie "push" Stock-updates von einer Console Application server, self-hosts einen WCF-Dienst an die verbundenen clients. Es zeigt auch, wie jedem Kunden Notizen hinzufügen können gegen eine Aktie und haben diese Notizen synchronisiert (geschoben vom server) an alle anderen verbundenen clients.
Die neueste version von der Probe (Teil 4) zeigt, wie das synchronisieren gedrückt updates zwischen Silverlight und WPF-clients über zwei server-Endpunkte wie folgt:
WPF clients die Verbindung zum WSDualHttpBinding endpoint-und Silverlight-clients die Verbindung zum PollingDuplexHttpBinding Endpunkt der gleichen WCF-Dienst. Die app zeigt auch, wie mit der Silverlight-client-access-policy-Anforderungen.
Kunden (Silverlight oder WPF) können Notizen hinzufügen, die gegen ein Lager in Ihrer Benutzeroberfläche und diese Hinweise verbreiten wieder auf den server geschoben werden, für alle anderen Kunden. Diese Kommunikation zeigt in beide Richtungen, und hoffentlich führt alle notwendigen Kommunikation die Ihre app benötigt.
Sehen Sie einen screenshot der demo-Anwendung hier.
InformationsquelleAutor der Antwort Peter McG
Nicht, bin schieben Flex in fan boy Mode, aber ganz sachlich ist dies die Art von Architektur, die wir bauen in allen unseren Flex-basierten Anwendungen routinemäßig. Hier ist, was wir tun, auf Flex - kein Zweifel, könnte es angemessen übersetzt zu Silverlight:
Nehmen wir drei Zutaten und integrieren Sie Sie zusammen, um dies zu erreichen Fähigkeit:
Letztere Punkt setzt die Comet-Muster, unterstützt AMF-Objekt-Marshalling (Adobe binäres Serialisierungsformat für ActionScript3-Objekte), und Brücken, um eine JMS-Warteschlange oder ein Thema. Als überbrückung zu einem Thema, anschließend mehrere Flex-clients in einem browser ausgeführt werden können Proxy als Abonnenten zu einem JMS-topic. Also, wenn jeder client veröffentlicht eine Nachricht (oder der server-side-code veröffentlicht in dem Thema), alle client-Abonnenten haben die Nachricht gedrückt, um Sie über BlazeDS und der Comet-Pattern-Implementierung.
Effektiv Sie benötigen, zu suchen oder zu schreiben, eine Komponente, die das leistet, was BlazeDS nicht. Möglicherweise müssen Sie auch zu implementieren client code für die Interaktion mit dem Comet Muster dieser server-seitige Komponente.
Tut WCF-Unterstützung der Komet Muster und bi-direktionale messaging? Vor allem, wo hält für HTTP und port 80 oder port 443 für SSL. Sieht aus wie Sie haben bereits geschaut und nichts gefunden für die bidirektionale messaging. So müssen Sie möglicherweise Rollen Sie Ihre ärmel hoch und machen Sie einige Codierung.
Einige Dinge zu beachten, über das tun von server push-to-web-app:
BlazeDS unterstützt zwei primäre Modi der Umsetzung der Comet-Muster (gibt ' s eigentlich eine 3. polling-option, bin aber, ihn zu ignorieren):
Der long-polling-man sollte mehr allgemein unterstützt die meisten web-Browser. So könnte man straffen, um gerade zu unterstützen, dass zunächst. Oder Sie können die Zeit verbringen, um Ihren client-code versuchen, HTTP-streaming, erste und switch zu long-polling, wenn nötig.
Als ein message-broker, der Ihnen publish/suscribe capatibility, könnten Sie die Verwendung von ActiveMQ-JMS. Es ist open source und kostenlos, mit aktiver Unterstützung der Gemeinschaft (die Sie kaufen können, Unterstützung zu). Plus können Sie nutzen, NMS integrieren Sie als .NET-client.
Mit einem message-broker sitzen in der middle-tier ist tatsächlich wichtig, weil es ein Ort für Nachrichten platziert werden, ist sicher. Wenn Ihre Kunden tun, long-polling, würden Sie nicht wollen, dass Sie verpassen keine neue Nachricht während eines Intervalls, wenn Sie nicht tatsächlich angeschlossen sind.
Andere Sache zu prüfen in hohe traffic-volume-Szenarien (Hunderte oder Tausende von Kunden, wie eine web site auf dem Internet), müssen Sie einen Ansatz für die Comet-Muster, die skalierbar ist.
In der Flex/Java-Welt, die BlazeDS-servlet (open source) wurde geändert, um das arbeiten mit asynchronen Modell. In Java einen socket-listener erstellt werden kann, verwenden NIO-Kanäle und Java Concurrency-Executor-thread-pools. Der Tomcat-web-server hat eine NIO-Hörer, und Unterstützung für asynchrone Servlet 3.0 Veranstaltungen. BlazeDS insbesondere geändert wurde, obwohl für die Arbeit mit dem Jetty-Webserver. Die Quintessenz ist, dass die Skalierbarkeit dieser asynchronen Ansatz bedeutet einen einzelnen physischen web-server erweitert um die Unterstützung für bis zu 20.000 gleichzeitige Comet-style-client-verbindungen.
Es ist schon eine Weile her, seit ich getan habe, ernst .NET-Programmierung, aber verwendet, um die io-Fähigkeiten waren ähnlich wie Java-1.1-mit Ausnahme der mit einem asynchronen Ergebnis-handler-Funktion. Dies, obwohl, ist nicht dasselbe wie die Erstellung asynchroner socket-Listener, die über Java NIO channels. Eine NIO-channel-Umsetzung unterstützen können Hunderte bis Tausende von socket-verbindungen mit einem relativ kleinen thread-pool. Aber C# und .NET mitgemacht hat, zwei oder drei signifikante Drehzahlen - vielleicht gab es neue io-Funktionen Hinzugefügt, die vergleichbar sind mit NIO-Kanäle.
InformationsquelleAutor der Antwort RogerV
Ich wollte nur klarstellen, dass die PollingDuplexHttpBinding nicht umsetzen, wahr ' push-Benachrichtigungen, wie offenbart seinen Namen (polling). Aus der msdn-Dokumentation:
Jedoch ist es effizienter als der traditionelle Weg der polling-a-web-service, da nach jeder Umfrage, die server halten Sie den Kanal offen für eine bestimmte Zeit (1 minute), und wenn eine Nachricht eintrifft, dass in der Zeit, es wird direkt 'push' die Nachricht an den client. Der client hat immer wieder erneuern Ihre Verbindung, es so zu sagen Umfragen den service.
Wenn Sie möchten, implementieren Sie Echtzeit-push-Benachrichtigungen mit silverlight-ich glaube, Sie brauchen, um die Arbeit mit sockets, und ich empfehle die Lektüre von Dan Wahlin s blog Beiträge über das Thema.
InformationsquelleAutor der Antwort Jonatan Lindén
Alternativ
wenn Sie möchten, eine nativen silverlight API mit keine proxies, Brücken-oder Webserver beteiligt, Sie könnte verwenden Nirvana von my-Channels, wie Sie Ihre messaging-middleware. Check-out Nirvana von my-Channels und Ihre Schaufenster Website. (sorry, ich bin ein neuer Benutzer und kann nicht senden links):
Alex
InformationsquelleAutor der Antwort
EDIT: ist es eigentlich gut funktioniert. Ich bekam schlecht infiziert von der "verborgenen Variablen" in einer closure 🙁
Benutzte ich die PollingDuplex für SL2 und ich denke, dass es ist nicht bereit für die Produktion noch.
Mein Haupt-Problem ist die Tatsache, dass Sie nicht diskriminieren, auf den clients auf der gleichen Maschine. Wenn ich 2 clients laufen dann einer von Ihnen werden nicht in der Lage, um den server Abfragen mehr und sterben timeout. Es ist eine SessionId, die andere für die 2 clients, aber es ist einfach ignoriert, auf der client-Seite.
Ebenso, wenn ich töten eine client-und dann eine neue erstellen, danach dann die neue client bekommt die push-updates von der vorherigen client für eine Weile.
Hatte jemand begegnen die gleichen Probleme oder sind Sie behoben, SL3?
Tatsächlich lief ich einige mehr demo-codes und festgestellt, dass aus irgendeinem Grund müssen Sie die InstanceContextMode und InstanceMode, so dass der service ist session-basiert und nicht ein singleton ist (soweit ich das sagen kann). Es gibt deutliche performance-Probleme in der einfachen demo-code, den ich zog.
Es ist sehr bedauerlich, dass dieses Verhalten nicht dokumentiert.
InformationsquelleAutor der Antwort R4cOON
Meine Organisation gefunden, die Silverlight-2.0/WCF push-Umsetzung ein wenig "nicht bereit für die prime Zeit", zumindest für das, was wir planen, es zu benutzen.
Wir gehen am Ende mit XMPP/Jabber, weil es eine gut geformte Tier, und Sie implementieren können, ziemlich leicht in Silverlight, indem Sie einfach immer einige Ressourcen aus dem internet.
Glaube ich, dass Silverlight 3.0 implementieren, die eine neuere/mehr gut geformten push-Umsetzung, was ich sagen kann, aus öffentlich verfügbaren Informationen.
InformationsquelleAutor der Antwort pearcewg
Den PollingDuplexHttpBinding ist wahrscheinlich der eleganteste Weg, es zu tun.
Einer possilby weniger alternative ist die Verwendung einer TCP-socket von den Silverlight-client. Immer wenn ein Silverlight-clients muss ein update geschoben, schicken Sie es, eine TCP-Nachricht enthält den Namen der WCF-service er aufrufen muss, oder einige andere leichte Gewicht Stück von Informationen.
Ich diesen Ansatz für eine Anwendung und es funktioniert gut.
InformationsquelleAutor der Antwort sipwiz
Einem viel einfacher und mehr leistungsstarke Lösung, die auf der Website http://www.udaparts.com/document/Tutorial/slpush.htm
InformationsquelleAutor der Antwort