我在WPF中有一个应用程序,它允许我添加,删除和编辑学生。用户界面可以多次打开。 当UI通过服务更改数据时,每个其他连接的客户端也应使用最新更改进行更新。
可以让wcf服务为我做吗?我们怎么做呢?
谢谢和问候,
丹娘
答案 0 :(得分:2)
每个WPF UI窗口都应与主机WCF服务建立连接。
服务必须是单身类型。 此外,您还必须启用会话。
每个UI窗口都应该开始拥有自己与服务的连接。并且还必须处理回调方法。
服务必须跟踪这些会话和回调方法ID。
现在,当UI线程对数据进行更改时(我假设正在考虑使用WCF服务),服务将不得不迭代会话集合并发送通知。
只有两个绑定支持此netTcp
和WSDualHttp
。
希望这有帮助。
服务和回拨服务如下所示:
[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);
}
}
}