当前位置:  开发笔记 > 编程语言 > 正文

Silverlight和推送通知

如何解决《Silverlight和推送通知》经验,为你挑选了2个好方法。

我正在为远程仪器创建Silverlight 2用户界面.在不同站点有两个并发用户与仪器(仪器和远程科学家的操作员)以及任何不与之交互的观察者用户进行交互,只是观看.但是,每当两个活动用户中的一个改变某些内容时,这些更改必须立即反映在所有用户的UI中,例如平移或缩放图像或注释或选择图像的一部分,将项目添加到列表框中显示的集合中.在客户端中,我使用可观察的集合,这些集合很容易反映该用户所做的更改,但是很难看到其他用户所做的更改.我可以从每个客户端轮询更改,但推送通知等更好.我已经广泛搜索了一些例子,但没有找到任何我需要的东西.Silverlight与WCF服务交互存在各种安全问题,这意味着许多潜在的示例无法正常工作.我基本上没有时间在这个项目上,需要快速帮助.有没有人有任何关于如何做到这一点的合适简单例子的建议?我是一名经验丰富的开发人员,但不得不自学Silverlight和WCF服务,我所在地区没有人知道这些.即使你已经完成了相当多的ASP.NET工作,我也不是web/Javascript专家.谢谢.我基本上没有时间在这个项目上,需要快速帮助.有没有人有任何关于如何做到这一点的合适简单例子的建议?我是一名经验丰富的开发人员,但不得不自学Silverlight和WCF服务,我所在地区没有人知道这些.即使你已经完成了相当多的ASP.NET工作,我也不是web/Javascript专家.谢谢.我基本上没有时间在这个项目上,需要快速帮助.有没有人有任何关于如何做到这一点的合适简单例子的建议?我是一名经验丰富的开发人员,但不得不自学Silverlight和WCF服务,我所在地区没有人知道这些.即使你已经完成了相当多的ASP.NET工作,我也不是web/Javascript专家.谢谢.



1> Peter McG..:

Silverlight 2支持使用新的WCF PollingDuplexHttpBinding支持推送通知.Silverlight SDK安装了两个程序集(一个用于Silverlight应用程序,一个用于WCF服务器).

我有一些博客文章和一个完整的示例应用程序,演示如何从控制台应用程序服务器"推送"库存更新,该服务器将WCF服务自托管到已连接的客户端.它还显示了每个客户端如何针对Stock添加注释并使这些注释同步(从服务器推送)到所有其他连接的客户端.

最新版本的示例(第4部分)显示了如何使用两个服务器端点同步Silverlight和WPF客户端之间的推送更新,如下所示:

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace StockServer
{
    public class StockServiceHost : ServiceHost
    {
        public StockServiceHost(object singletonInstance, params Uri[] baseAddresses)
            : base(singletonInstance, baseAddresses)
        {
        }

        public StockServiceHost(Type serviceType, params Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
        }

        protected override void InitializeRuntime()
        {
            this.AddServiceEndpoint(
                typeof(IPolicyProvider),
                new WebHttpBinding(),
                new Uri("http://localhost:10201/")).Behaviors.Add(new WebHttpBehavior());

            this.AddServiceEndpoint(
                typeof(IStockService),
                new PollingDuplexHttpBinding(),
                new Uri("http://localhost:10201/SilverlightStockService"));

            this.AddServiceEndpoint(
                typeof(IStockService),
                new WSDualHttpBinding(WSDualHttpSecurityMode.None),
                new Uri("http://localhost:10201/WpfStockService"));

            base.InitializeRuntime();
        }
    }
}

WPF客户端连接到WSDualHttpBinding端点,Silverlight客户端连接到同一WCF服务的PollingDuplexHttpBinding端点.该应用程序还显示了如何处理Silverlight客户端访问策略要求.

客户端(Silverlight或WPF)可以在其UI中添加针对Stock的注释,这些注释将传播回服务器以推送到所有其他客户端.这表明了在任一方向上的通信,并希望执行您的应用程序所需的所有必要通信.

您可以在此处看到演示应用程序的屏幕截图.



2> RogerV..:

并不是说我正在以风扇男孩的方式推动Flex,但实际上这就是我们常规构建到所有基于Flex的应用程序中的那种架构.以下是我们在Flex上所做的事情 - 毫无疑问,它可以适当地转换为Silverlight:

我们采用三种成分并将它们集成在一起以实现此功能:

    Comet模式(与服务器推送通知的HTTP兼容方式 - 在维基百科上查看更多信息)

    JMS消息传递主题(发布/订阅者队列)

    Adobe BlazeDS servlet

后一项实现Comet模式,支持AMF对象编组(Adobe的ActionScript3对象的二进制序列化格式),以及桥接到JMS队列或主题.在桥接到主题时,可以将在浏览器中运行的多个Flex客户端代理为JMS主题的订阅者.因此,如果任何客户端发布消息(或服务器端代码发布到主题中),则所有客户端订阅者将通过BlazeDS和Comet Pattern实现将消息推送给他们.

实际上,您需要找到或编写一个完成BlazeDS功能的组件.您可能还需要实现一些与此服务器端组件的Comet模式交互的客户端代码.

WCF是否支持Comet模式和双向消息传递?特别是在符合HTTP和端口80或端口443的情况下,SSL.看起来你已经调查过这个并没有找到任何用于双向消息传递的东西.所以你可能需要卷起袖子做一些编码.

有关将服务器推送到Web应用程序的一些注意事项:

BlazeDS支持实现Comet模式的两种主要模式(实际上有第三种轮询选项,但忽略它):

    长轮询

    HTTP流媒体

您应该发现长轮询,对大多数Web浏览器更加普遍支持.因此,您可以简化为最初支持.或者您可以花时间让客户端代码首先尝试HTTP流式传输,并在必要时切换到长轮询.

对于可以提供发布/控制能力的消息代理,您可以考虑使用ActiveMQ JMS.它是开源的,免费的,有积极的社区支持(你也可以购买支持).此外,您可以使用NMS作为.NET客户端进行集成.

让消息代理坐在中间层实际上很重要,因为它将是一个安全放置消息的地方.如果您的客户端正在进行长轮询,您不希望它们在实际连接时间隔期间丢失任何新消息.

在高流量场景(数百或数千个客户端,例如Internet上的网站)中需要考虑的另一件事是,您需要采用可扩展的Comet模式方法.

在Flex/Java世界中,BlazeDS servlet(开源)已经过修改,可以与异步模型一起使用.在Java中,可以构建套接字侦听器以使用NIO通道和Java Concurrency Executor线程池.Tomcat Web服务器具有NIO侦听器并支持异步Servlet 3.0事件.但是,BlazeDS已被修改,以便与Jetty Web服务器一起使用.最重要的是,这种异步方法的可扩展性意味着可以增强单个物理Web服务器,以支持最多约20,000个并发Comet样式的客户端连接.

我已经有一段时间了,因为我已经完成了严格的.NET编程,但习惯了io功能与Java 1.1非常相似,只是具有异步结果处理程序功能.但是,这与通过Java NIO通道创建异步套接字侦听器不同.NIO通道实现可以使用相对较小的线程池支持数百到数千个套接字连接.但是C#和.NET已经经历了两到三次重大转变 - 也许已经添加了与NIO频道相当的新io功能.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有