我试图将实际的服务数据从服务功能中分离出来,因此将数据作为一个数据协定返回,其中包含几个属性(数据成员)。客户端代码是使用svcutil /edb生成的,svcutil还为代理代码生成INotifyPropertyChanged实现。据我的测试所示,对于服务器上发生的更改,该代码不会调用PropertyChanged事件。此外,获取属性只会在获取数据合约代理时返回属性值。
基本上,这是我得到的:
(服务器端)
[ServiceContract]
public interface IControllerService
{
[OperationContract]
DataModel GetDataModel();
}
[DataContract]
public class DataModel : INotifyPropertyChanged
{
private string _state;
[DataMember]
public string State
{
set
{
if (_state != value)
{
_state = value;
OnPropertyChanged("State");
}
}
get
{
return _state;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[OperationContract]
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}(客户端)
private void Test()
{
ControllerServiceClient client = new ControllerServiceClient();
DataModel model = client.GetDataModel();
model.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(DataModelChanged);
Console.WriteLine(model.State);
// ... invoke something that forces the server to change the data model
// Output stays the same
Console.WriteLine(model.State);
}
private void DataModelChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
// This method never get called for server-side changes
}我期望数据契约代理充当服务器数据契约的透明代理,但它似乎是完全未绑定的。
万分感谢,干杯,
罗曼提
发布于 2010-01-25 23:32:12
WCF不会神奇地生成到服务器端对象的挂钩。它只是调用ServiceContract中定义的任何方法,并将数据返回给您。除此之外,没有其他的沟通渠道。
因此,在您的场景中,您将需要一个双工服务(请参阅:http://msdn.microsoft.com/en-us/library/cc645027%28VS.95%29.aspx),该服务手动回调客户端,以获取来自服务器的任何更改。
发布于 2010-01-25 23:46:33
不要把DataContract看作一个“透明代理”,它更像是一个接口。
仅仅因为两个类实现了相同的接口,并不意味着它们做的是完全相同的事情。DataContract的客户端和服务器端也是如此。
客户端(这里)是基于DC生成的,还包括数据绑定方面的帮助,如INPC和ObservableCollections,就是这样,没有魔力。例如,如果您的服务器端对象上有一些已计算的属性,则该逻辑将不会出现在客户端。
如前所述,如果您需要服务器调用客户端上的事件,您将需要某种双向绑定/服务,没有其他方法(除了通过轮询服务器模拟它,等等)。
https://stackoverflow.com/questions/2133150
复制相似问题