我创造一个Silverlight2的用户接口的远程文书。有两个并行的用户在不同的地点相互作用的仪器(运营者在仪器和远程学家)和任何数量的观察员的用户不相互作用有了它,只是在观看。然而,只要一两个活动用户改变的东西,这些变化,必须立即反映在联合国教科文组织统计研究所的所有用户,例如摇动或放大图像或注释或选择图像的一部分,添加项目的收集显示在一个列表框。在我的客户使用可观察到集合,很容易反映出所作的改变,使用者,但是这是很难看到改变的另一个用户。我可以调查为改动从每个客户,但一些东西喜欢推动通知可能会更好。我有广泛的派对的实例,但没有找到任何东西,这是相当我需要什么。有各种各样的安全问题与Silverlight与WCF服务,这意味着许多潜在的实例只是不工作。我已经基本上运行的时间在这个项目和需要帮助快。没有任何人有任何建议的一个适当的简单的例子,它说明如何做到这一点?我是一名经验丰富的开发,但必须教自己Silverlight和WCF服务和有没有人在我的领域,谁知道任何关于这些。即使寿'我已经做了大量的ASP.NET 工作我不是一个web/Javascript师。谢谢。

有帮助吗?

解决方案

推动通知是支持在Silverlight2.采用新的WCF PollingDuplexHttpBinding支持。有两个组件的安装与控SDK(一个企业实现动态it应用程序的一个WCF服务器).

我有一个 几个博客的员额和一个全面的样本应用程序 演示如何"推"库存更新从控制台应用程序服务器,自主机WCF服务于连接客户。它还显示了每个客户可以添加注意针对股票和那些笔记同步(推从服务器)的所有其他连接客户。

最新版本的示例(第4部分)显示如何同步推更新两者之间的译的客户使用两个服务器的端点如下:

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端点。户连接到PollingDuplexHttpBinding端点的同WCF服务。该应用程序还显示如何处理控客户接入的政策的要求。

客户(Silverlight或WPF)可以添加注意到对一个股在他们的用户界面和这些笔记回传播的服务器被推到其他所有客户。这表明了通信在任何一方向和希望执行所有必要的通信需要对应用程序。

你可以看到的截图 演示运行的应用程序在这里.

其他提示

并不是说我以粉丝的方式推动 Flex,但事实上,这是我们在所有基于 Flex 的应用程序中常规构建的架构。以下是我们在 Flex 上所做的工作 - 毫无疑问它可以适当地转换为 Silverlight:

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

  1. Comet 模式(一种执行服务器推送通知的 HTTP 兼容方式 - 有关详细信息,请参阅 Wikipedia)
  2. JMS 消息传递主题(发布/订阅者队列)
  3. Adobe BlazeDS servlet

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

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

WCF 是否支持彗星模式和双向消息传递?特别是在符合 HTTP 和 SSL 端口 80 或端口 443 的情况下。看起来您已经研究过这一点,但没有找到任何用于双向消息传递的内容。因此,您可能需要卷起袖子进行一些编码。

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

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

  1. 长轮询
  2. HTTP 流式传输

您应该会发现大多数网络浏览器更普遍支持长轮询。因此,您可能会简化为最初只提供支持。或者,您可以花时间让客户端代码首先尝试 HTTP 流,并在必要时切换到长轮询。

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

让消息代理位于中间层实际上很重要,因为它将是安全放置消息的地方。如果您的客户端正在进行长轮询,您不希望他们在实际未连接的时间间隔内错过任何新消息。

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

在 Flex/Java 世界中,BlazeDS servlet(开源)已被修改为可以使用异步模型。在 Java 中,可以构建套接字侦听器来使用 NIO 通道和 Java 并发执行器线程池。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 功能。

我只是想澄清,PollingDuplexHttpBinding没有实现“真正的”推送通知,为显示其名称(轮询)。从 MSDN文档

  

当与此结合,Silverlight客户端周期性地轮询网络层上的服务,并检查该服务希望在回调信道发送任何新信息构成。该服务排队的客户端回调信道发送的所有消息并将其传送给客户端时,客户端轮询服务。

然而,它是比轮询Web服务的传统方式更有效的,因为每个轮询之后,服务器将保持通道开放一定时间(比如1分钟),并且如果一个消息在该时间到达时,它会直接地“推”的消息给客户端。客户必须反复重申其连接时,这样说来轮询服务。

如果你想实现的Silverlight我相信你需要与插座的工作真正推送通知,我建议你阅读一些丹Wahlin的博客文章中关于这个问题的。

可替换地,

如果你想参与,你可以使用必杀技从我的信道作为消息中间件没有代理,桥梁或Web服务器本地的Silverlight API。从我的渠道和他们展示网站看看涅槃。 (抱歉,我是一个新的用户和不能提交链接):

亚历

编辑:它的实际工作的罚款。我被严重的“隐变量”在一个闭合咬伤:(

我用PollingDuplex为SL2,我认为这是没有准备好生产呢。

我的主要问题是,它并没有在客户端在同一台机器上的歧视。如果我运行2个客户端,然后其中一人将无法再轮询服务器,会死超时。有一个会话ID是为2个客户端不同,但它只是忽略了在客户端上。

同样的,如果我杀了一个客户端,然后再把创建一个新的,则新的客户端会得到从以前的客户端的推送更新了一段时间。

没有人会遇到同样的问题,或者是它们固定SL3?

其实我跑了一些演示代码和意识到,由于某种原因,你必须指定InstanceContextMode和InstanceMode这样服务是基于会话,而不是单(据我可以告诉)。有在我把简单的演示代码明显的性能问题。

这是很不幸的是,这种行为不记载。

我的组织中发现Silverlight的2.0 / WCF推动实施是有点“不准备好黄金时间”,至少我们正计划用它来。

我们结束了与XMPP / Jabber的打算,因为它是一个更良好形成兽,你可以在Silverlight中很容易实现,仅仅通过获得一些资源,关闭互联网。

我相信Silverlight的3.0将实施新的/更良好形成推动落实,从我可以从公开的信息告诉我们。

在PollingDuplexHttpBinding可能是最优雅的方式来做到这一点。

一个possilby较少涉及替代方法是使用TCP套接字从Silverlight客户端。每当Silverlight客户端中的一个需要有一个更新推就可以发送它含有它需要调用或一些其它重量轻的片的信息WCF服务的名称的TCP消息

我使用这种方法对于应用程序和它工作得很好。

在现场 HTTP://www.udaparts的.com /文件/教程/ slpush.htm

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top