1

実際のサービス データをサービス機能から分離しようとしているため、複数のプロパティ (データ メンバー) を保持するデータ コントラクトとしてデータを返しています。クライアント コードは、プロキシ コードの INotifyPropertyChanged 実装も生成する svcutil /edb を使用して生成されます。私のテストで明らかになった限り、そのコードはサーバーで発生した変更に対して 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
}

データ コントラクト プロキシは、サーバーのデータ コントラクトに対する透過的なプロキシとして機能することを期待していますが、完全にバインドされていないようです。

よろしくお願いします。

ロムート

4

2 に答える 2

2

WCF は、サーバー側オブジェクトへのフックアップを魔法のように生成しません。ServiceContract で定義されているメソッドを呼び出すだけで、データが返されます。それ以上のコミュニケーションチャネルはありません。

したがって、あなたのシナリオでは、クライアントからの変更でクライアントにコールバックする二重サービス ( http://msdn.microsoft.com/en-us/library/cc645027%28VS.95%29.aspxを参照) が必要になります。サーバーを手動で。

于 2010-01-25T15:32:11.897 に答える
1

DataContract を「透過的なプロキシ」と考えないでください。これはむしろインターフェースです。

2 つのクラスが同じインターフェイスを実装しているからといって、まったく同じことを行うわけではありません。同じことが、DataContract のクライアント側とサーバー側にも当てはまります。

クライアント側 (ここ) は DC に基づいて生成され、INPC や ObservableCollections などの DataBinding に役立つ側面も含まれています。たとえば、サーバー側のオブジェクトに計算されたプロパティがいくつかある場合、そのロジックはクライアントには存在しません。

前述のように、サーバーがクライアントでイベントを呼び出す必要がある場合は、ある種の双方向バインディング/サービスが必要になります。他に方法はありません (サーバーのポーリングなどを介してシミュレートする以外に方法はありません)。 .)

于 2010-01-25T15:46:33.283 に答える