Я пытаюсь отделить фактические данные службы от функциональности службы и поэтому возвращаю данные в виде контракта данных, который содержит несколько свойств (членов данных). Код клиента генерируется с использованием svcutil / edb, который также генерирует реализацию 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
}
Я ожидаю, что прокси-сервер контракта на данные действует как прозрачный прокси-сервер для контракта на данные сервера, но, похоже, он полностью не связан.
Заранее большое спасибо,
Cheers,
Romout