Silverlight et des notifications push
Je suis entrain de créer un Silverlight 2 de l'interface utilisateur à distance à un instrument. Il y a deux utilisateurs simultanés sur les différents sites de l'interaction avec l'instrument (l'opérateur à l'instrument et à distance scientifique) et un certain nombre d'observateurs utilisateurs de ne pas interagir avec elle, juste à les regarder. Cependant, chaque fois que l'un des deux utilisateurs actifs des modifications, ces modifications doivent être immédiatement pris en compte dans l'Isu de tous les utilisateurs, par exemple, un panoramique ou un zoom d'une image ou d'annoter ou de sélectionner une partie d'une image, ajouter des éléments à une collection dans une listbox. Dans le client-je utiliser les collections observables qui facilement tenir compte des modifications apportées par l'utilisateur, mais il est plus difficile de voir les modifications apportées par un autre utilisateur. Je peux sondage pour les modifications de chaque client, mais quelque chose comme les notifications push serait mieux. J'ai beaucoup Cherché sur google pour des exemples, mais rien trouvé qui est tout à fait ce dont j'ai besoin. Il y a toutes sortes de problèmes de sécurité avec Silverlight l'interaction avec des services WCF, ce qui signifie beaucoup de potentiel exemples ne fonctionnent tout simplement pas. J'ai essentiellement à court de temps sur ce projet et besoin d'aide rapidement. Quelqu'un a une suggestion d'un exemple simple qui montre comment faire cela? Je suis un développeur expérimenté, mais ont dû apprendre par moi-même Silverlight et des services WCF et il n'y a personne dans ma région qui ne sait rien sur ces. Même tho' j'ai fait une bonne quantité de ASP.NET travail je ne suis pas un web/Javascript gourou. Merci.
Vous devez vous connecter pour publier un commentaire.
De notification Push est pris en charge dans Silverlight 2 à l'aide de la nouvelle WCF PollingDuplexHttpBinding de soutien. Il y a deux assemblées installé avec le kit de développement Silverlight (un pour application Silverlight pour un serveur WCF).
J'ai un quelques articles de blog et un exemple d'application qui montrent comment "pousser" mises à jour des Stocks à partir d'une Console de serveur d'Applications que l'auto-héberge un service WCF pour les clients connectés. Il montre également comment chaque client peut ajouter des notes à l'encontre d'un Stock et d'avoir ces notes synchronisées (poussé à partir du serveur) pour tous les autres clients connectés.
La dernière version de l'échantillon (Partie 4) montre comment synchroniser poussé les mises à jour entre Silverlight et WPF clients à l'aide de deux points de terminaison de serveur comme suit:
WPF clients de se connecter à la WSDualHttpBinding d'extrémité et Silverlight clients de se connecter à la PollingDuplexHttpBinding point de terminaison du même service WCF. L'application montre comment gérer le client Silverlight l'accès des exigences de la politique.
Clients (Silverlight ou WPF) pouvez ajouter des notes à l'encontre d'un Stock dans leur INTERFACE utilisateur et ces notes se propager vers le serveur pour être poussé à tous les autres clients. Cela démontre de la communication dans les deux sens et nous espérons que joue la communication nécessaire requis pour votre application.
Vous pouvez voir une capture d'écran de la démo de l'application en cours d'exécution ici.
Pas que je m'en poussant Flex en fan boy de la mode, mais la matière d'un ton neutre c'est le type de l'architecture de nous construire dans toutes nos Flex applications régulièrement. Voici ce que nous faisons sur Flex - pas de doute, il pourrait être convenablement traduit de Silverlight:
Nous prenons trois ingrédients et de les intégrer ensemble pour accomplir cette capacité:
De ce dernier point met en œuvre la Comète modèle, prend en charge l'AMF objet de regroupement (Adobe binaire du format de sérialisation pour ActionScript3 objets), et des ponts, et une file d'attente JMS ou le sujet. Lors de l'intégration d'une rubrique, puis plusieurs Flex clients exécutant dans un navigateur peut être mandaté en tant qu'abonnés à une rubrique JMS. Donc, si un client publie un message (ou le code côté serveur publie dans le sujet), tous les clients abonnés auront le message poussé par BlazeDS et la Comète Modèle de mise en œuvre.
Efficacement, vous avez besoin de localiser ou d'écrire un composant qui accomplit ce que BlazeDS n'. Vous pourriez aussi avoir besoin de mettre en œuvre certaines de code client qui interagit avec la Comète motif de ce composant côté serveur.
Ne WCF soutien de la Comète Modèle et bi-directionnelle de messagerie? Surtout où est conforme à HTTP et le port 80 ou 443 pour SSL. On dirait que vous avez déjà vu et rien trouvé pour le bi-directionnelle de messagerie. Vous devrez peut-être rouler vos manches et faire un peu de codage.
Des choses à noter à propos de faire server push pour une application web:
BlazeDS prend en charge deux modes primaires de la mise en œuvre de la Comète modèle (il y a en fait une 3ème option interrogation, mais je suis ignorant):
Le long du scrutin que vous devriez trouver plus universellement supportable pour la plupart des navigateurs web. Donc, vous pourriez rationaliser juste de soutenir que, d'abord. Ou vous pourriez passer du temps à faire votre code client, essayez HTTP streaming et de passer au long du scrutin, si nécessaire.
À un courtier de messages qui peuvent fournir publier/souscrire capatibility, vous pourriez envisager d'utiliser ActiveMQ JMS. Il est open source et gratuit avec l'actif soutien de la communauté (vous pouvez acheter un soutien trop). De Plus, vous pouvez utiliser le SGEN et de l'intégrer comme un .NET client.
Avoir un message broker assis au milieu de la couche qui est réellement important, car il sera un lieu pour les messages destinés à être placés en toute sécurité. Si vos clients sont en train de faire le long du scrutin, vous ne voulez pas rater un nouveau message pendant un intervalle de temps quand elles ne sont pas réellement connecté.
Une autre chose à considérer dans un volume élevé de trafic scénarios (des centaines ou des milliers de clients, comme un site web sur l'Internet), vous avez besoin d'avoir une approche de la Comète Modèle qui est évolutive.
Dans le Flex/Java monde, le BlazeDS servlet (qui est open source) a été modifié pour fonctionner avec modèle asynchrone. En Java, une prise écouteur peut être construit à utiliser NIO canaux et Java Simultanéité Exécuteur des pools de threads. Le serveur web Tomcat a un NIO port d'écoute et de soutien pour asynchrones Servlet 3.0 événements. BlazeDS, en particulier, a été modifié, bien que, pour travailler avec le serveur web Jetty. La ligne de fond est que l'évolutivité de cette approche asynchrone signifie qu'un simple serveur web physique peut être amélioré pour prendre en charge jusqu'à environ 20 000 simultanées Comet connexions client.
Il a été un moment depuis que j'ai fait sérieux .NET de programmation mais utilisé pour le io capacités étaient un peu comme Java 1.1, sauf avec asynchrone résultat fonctionnalité de gestionnaire. Cela, cependant, n'est pas la même chose que la création de socket asynchrones auditeurs via Java NIO canaux. Une NIO canal de la mise en œuvre peut prendre en charge des centaines de milliers de connexions socket avec un relativement petit pool de threads. Mais C# et .NET a traversé deux ou trois tours - peut-être il y a eu de nouveaux io capacités ajoutée qui sont comparables à NIO. channels.
Je voulais juste préciser que le PollingDuplexHttpBinding ne pas mettre en œuvre le "vrai" notifications push, comme le révèle son nom (d'interrogation). À partir de la la documentation msdn:
Cependant, il est plus efficace que la méthode traditionnelle de l'interrogation d'un service web, puisque, après chaque scrutin, le serveur va garder le canal ouvert pendant un certain temps (disons 1 minute), et si un message arrive en ce moment, il va directement à "pousser" le message au client. Le client a à plusieurs reprises renouveler sa connexion, il donc dire que les sondages le service.
Si vous souhaitez mettre en œuvre de véritables notifications push avec silverlight je crois que vous avez besoin de travailler avec des sockets, et je vous recommande la lecture de certains de Dan Wahlin blog posts sur le sujet.
Sinon,
si vous voulez une native API silverlight sans proxy, des ponts ou des serveurs web, vous pourriez utiliser le Nirvana de mon-Canaux en tant que votre messagerie middleware. Découvrez le Nirvana de mon Canaux et de leur site vitrine. (désolé, je suis un nouvel utilisateur et je ne peux soumettre des liens):
Alex
EDIT: ça fonctionne réellement bien. J'ai eu mal mordu par la "variable cachée" dans une closure 🙁
J'ai utilisé le PollingDuplex pour SL2 et je pense qu'il n'est pas prêt pour la production de encore.
Mon principal problème est le fait qu'il ne fait pas de discrimination sur les clients sur la même machine. Si je run 2 clients, puis l'un d'eux ne sera pas en mesure d'interroger le serveur plus et va mourir de délai d'attente. Il y a un id de session qui est différent pour les 2 clients, mais c'est tout simplement ignorés sur le côté client.
De même, si je tue un client, puis en créer une nouvelle par la suite, puis le nouveau client obtiendra la pousser les mises à jour du client précédent pour un certain temps.
Quelqu'un rencontre les mêmes problèmes ou sont-ils résolus dans SL3?
En fait, j'ai couru quelques plus de demo codes et réalisé que pour une raison quelconque, vous devez spécifier le InstanceContextMode et InstanceMode afin que le service est basée sur la session et pas un singleton (autant que je puisse en dire). Il y a clairement des problèmes de performances dans la simple démonstration de code que j'ai tiré.
Il est tout à fait regrettable que ce comportement n'était pas documenté.
Mon organisation trouvé le Silverlight 2.0/WCF-poussoir de mise en œuvre pour être un peu "pas prêt pour le prime time", au moins pour ce que nous avions l'intention de l'utiliser pour.
Nous avons fini par aller avec XMPP/Jabber, parce que c'est un plus bien formé bête, et vous pouvez la mettre en œuvre assez facilement dans Silverlight, simplement en obtenant des ressources de l'internet.
Je crois que Silverlight 3.0 mettra en œuvre une nouvelle/plus bien formé pousser la mise en œuvre, à partir de ce que je peux dire à partir des informations disponibles publiquement.
La PollingDuplexHttpBinding est probablement la façon la plus élégante de le faire.
Un possilby moins impliqués alternative est d'utiliser une socket TCP à partir de votre client Silverlight. Chaque fois que l'un des clients de Silverlight doit avoir une mise à jour poussé, vous pouvez envoyer un message TCP qui contient le nom de la WCF service qu'il doit appeler ou certains autres poids léger morceau de l'information.
- Je utiliser cette approche pour une application et il fonctionne bien.
Beaucoup plus simple et plus puissante solution sur le site http://www.udaparts.com/document/Tutorial/slpush.htm