2

サーバー側のコレクションが(クライアントアクションまたはサーバーアクションによって)変更された場合、wcf-serviceからwcf-clientにPropertyChangedイベントを取得しようと何日も試みています。コールバックを使用してリストをリロードする代わりに、より良い解決策が必要です...または?

サーバー側:(別の投稿の例とほぼ同じ) WCFデータコントラクトとしてのObservableCollectionおよびCollectionChangedイベント

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」を受け取りませんか?

どうしたの?私の間違いと誤解はどこにありますか?

4

1 に答える 1

0

SignalRをご覧になることをお勧めします。これは、リアルタイム メッセージングをすぐに実装するのに役立つ素晴らしいオープン ソース プロジェクトです。利用可能なさまざまなクライアント用のライブラリがあり、それらは非常に使いやすいです。

このクイックスタートを見てください。本当に簡単です: https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs

私は WCF 二重コールバックを使用しましたが、バインディングによっては、インターネット経由でサービスを公開したい場合、頭痛の種になるだけです (ファイアウォール、NAT、および Net.Tcp IIS 要件)。DuplexHttpBindingを使用しましたが、運用準備完了状態にするためにいくつかの作業が必要です。

于 2012-10-01T21:31:06.293 に答える