使用Wcf服务通知UI的多个实例

时间:2014-03-02 11:31:16

标签: c# .net wcf

我在WPF中有一个应用程序,它允许我添加,删除和编辑学生。用户界面可以多次打开。 当UI通过服务更改数据时,每个其他连接的客户端也应使用最新更改进行更新。

可以让wcf服务为我做吗?我们怎么做呢?

谢谢和问候,

丹娘

1 个答案:

答案 0 :(得分:2)

每个WPF UI窗口都应与主机WCF服务建立连接。

服务必须是单身类型。 此外,您还必须启用会话。

每个UI窗口都应该开始拥有自己与服务的连接。并且还必须处理回调方法。

服务必须跟踪这些会话和回调方法ID。

现在,当UI线程对数据进行更改时(我假设正在考虑使用WCF服务),服务将不得不迭代会话集合并发送通知。

只有两个绑定支持此netTcpWSDualHttp

希望这有帮助。

服务和回拨服务如下所示:

[ServiceContract(SessionMode = SessionMode.Required,
    CallbackContract = typeof(INotifyMeDataUpdate))]
public interface IService
{
    [OperationContract(IsInitiating=true)]
    void Register();

    [OperationContract(IsTerminating= true)]
    void Unregister();

    [OperationContract(IsOneWay=true)]
    void Message(string theMessage);
}

public interface INotifyMeDataUpdate
{
    [OperationContract(IsOneWay=true)]
    void GetUpdateNotification(string updatedData);
}

实施如下:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class Service : IService
{
    object _lock = new object();
    Dictionary<string, INotifyMeDataUpdate> _UiThreads =
        new Dictionary<string, INotifyMeDataUpdate>();

    public void Register()
    {
        string id = OperationContext.Current.SessionId;

        if (_UiThreads.ContainsKey(id)) _UiThreads.Remove(id);
        _UiThreads.Add(id, OperationContext.Current.GetCallbackChannel<INotifyMeDataUpdate>());
    }

    public void Unregister()
    {
        string id = OperationContext.Current.SessionId;

        if (_UiThreads.ContainsKey(id)) _UiThreads.Remove(id);
    }

    public void Message(string theMessage)
    {
        foreach (var key in _UiThreads.Keys)
        {
            INotifyMeDataUpdate registeredClient = _UiThreads[key];
            registeredClient.GetUpdateNotification(theMessage);
        }
    }
}