使用PUSH方法实现自动更新服务器和客户端

时间:2011-09-23 09:08:47

标签: .net wcf

我在客户端上运行我的软件(.NET)。每当有新的更新时,我都需要通过网络将更新推送到客户端。

我想实现在主服务器上运行的Web服务,该服务向客户端广播更新通知。对于dat,CLient必须通过Web将其身份注册到服务器。

服务器将发送有关更新可用性的通知。客户端必须从服务器下载更新。(即)服务器将启动上载过程,客户端必须下载。

我不希望程序始终在客户端计算机上运行并检查更新。

WCF会不错? ..这可能实施吗? ..我知道网络环境中存在很多限制因素。欢迎提出意见......

2 个答案:

答案 0 :(得分:1)

对于软件更新,除非客户端软件始终运行,否则我不会执行推送通知。更好的选择可能是让客户端在软件首次启动时检查服务器是否有新的更新。维护起来越少,实施起来就越容易。使用推送通知,客户端始终必须有一个监听器,客户端可以关闭监听器。您还需要维护所有连接的清单。如果所有客户端都在同一网络上运行,请单击一次部署可能是一个选项。它允许您对其进行配置,以便在发布新更新时客户端必须更新。

答案 1 :(得分:0)

是的,您可以在服务器之间实现推送功能。您只需要在服务器中维护连接的客户端列表,方法是使用WCF服务存储每个客户端的实例上下文对象,并调用将在客户端实现的回调方法。所以所有客户都将通过回调方法获得更新。

您可以存储客户端的实例上下文对象,如下所示,其中Client列表是哈希表:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class HostService : IHostService
    {

    public bool Connect(Guid applicationId)
    {
    if (!ClientList.ContainsKey(applicationId))
                        {
                            IHostServiceCallback client = OperationContext.Current.GetCallbackChannel<IHostServiceCallback>();
    ClientList.Add(applicationId, client);
    }
}

主机服务接口:

[ServiceContract(CallbackContract = typeof(IHostServiceCallback), SessionMode = SessionMode.Required)]
    public partial interface IHostService
    {
        [OperationContract]
        bool Connect(Guid applicationId);
}

服务的回调类:

[ServiceContract]
    public partial interface IHostServiceCallback
    {
        [OperationContract(IsOneWay = true)]
        void SendNotification(string message);
}

当您的服务器在任何事件处理程序中收到通知时,请将其发送给所有客户端,例如:

private void Notification_Received(object sender, EventReceivedEventArgs e)
{
foreach (IHostServiceCallback client in ClientList.Values)
            {
                try
                {
                    client.SendNotification(notificationMessage);
                }
                catch
                {
                }
            }
}

在客户端应用程序中,您已实现了回调方法,如:

public partial class Window1 : Window, IHostServiceCallback
{
    public void SendNotification(string message)
    {
           // do some operation
    }
}