我正在为远程仪器创建一个Silverlight 2用户界面。在不同地点有两个并发用户正在与仪器交互(仪器的运算符(operator)和远程科学家),并且有任意数量的观察者用户不与仪器交互,而只是在观看。但是,每当两个 Activity 用户之一进行更改时,这些更改必须立即反射(reflect)在所有用户的UI中,例如平移或缩放图像或注释或选择图像的一部分,将项目添加到列表框中显示的集合中。在客户端中,我使用可观察的集合,这些集合可以轻松反射(reflect)该用户所做的更改,但是很难看到其他用户所做的更改。我可以轮询每个客户端的更改,但是像推送通知这样的方法会更好。我已经在Google上广泛搜索了示例,但没有找到我需要的任何东西。 Silverlight与WCF服务进行交互时,会遇到各种各样的安全问题,这意味着许多潜在的示例都不起作用。我基本上没有时间在这个项目上,需要快速的帮助。有没有人建议一个合适的简单示例说明如何做到这一点?我是一位经验丰富的开发人员,但必须自学Silverlight和WCF服务,因此我所在的地区没有人对此有任何了解。即使我已经做了大量的ASP.NET工作,但我不是Web / Javascript专家。谢谢。
最佳答案
Silverlight 2使用新的WCF PollingDuplexHttpBinding支持来支持推送通知。 Silverlight SDK(one for Silverlight app one for WCF server)安装了两个程序集。
我有一个few blog posts and a full sample application,它演示了如何从控制台应用服务器“推送”库存更新,该服务器将WCF服务自动托管到连接的客户端。它还显示了每个客户端如何针对股票添加便笺,以及如何将这些便笺同步(从服务器推送)到所有其他连接的客户端。
该示例的最新版本(第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中针对库存添加注释,这些注释会传播回服务器以推送到所有其他客户端。这说明了双向通信,并有望执行应用程序所需的所有必要通信。
您可以看到demo application running here的屏幕截图。
关于silverlight - Silverlight和推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640488/