如果服务器端的集合发生了变化(通过客户端操作或服务器操作),我几天都在尝试从我的wcf-service到Wcf-client获取PropertyChanged事件。 必须有一个更好的解决方案,而不是使用回调并重新加载列表...或?
在服务器端:(几乎像另一篇文章的例子) ObservableCollection and CollectionChanged event as WCF datacontract
public interface IObservableService
{
[OperationContract(IsOneWay = false)]
Data getData();
}
[DataContract]
public class Data : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
Console.WriteLine("Notify()");
}
}
private ObservableCollection<string> list;
internal Data()
{
list = new ObservableCollection<string>();
list.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(list_CollectionChanged);
}
void list_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
Console.WriteLine("list_CollectionChanged");
Notify("DataList");
Notify("Data");
}
[DataMember]
public ObservableCollection<string> DataList
{
get
{
return list;
}
set {
list = value;
Console.WriteLine("set DataList");
Notify("DataList");
Notify("Data");
}
}
}
在客户端:
ObservableServiceClient client = new ObservableServiceClient();
Data data = client.getData();
到目前为止它的工作......我可以在客户端查询集合,但是当服务器集合发生变化时,我没有收到“propertyChanged”?
怎么了?我的错误在哪里? missunderstanding?
答案 0 :(得分:0)
我建议你看看SignalR。这是一个非常棒的开源项目,可以帮助您立即实现实时消息传递。有适用于不同客户的库,它们非常易于使用。
看看这个快速入门。这真的很简单:https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs
我已经使用过WCF双工回调,但是根据绑定,如果你想通过互联网公开你的服务,它只会让你头疼(防火墙,NAT和Net.Tcp IIS要求)。我使用了DuplexHttpBinding但是需要一些工作才能使它进入生产就绪状态。