0

さて、サービスがクライアントに通知をプッシュする方法を変更します。現在、ServiceModelExが機能している方法は、いずれかのクライアントがイベントにサブスクライブされている場合、メッセージがそれらのユーザー向けであるかどうかに関係なく、サブスクライブされているすべてのユーザーにメッセージを送信することです。クライアントで、私はメッセージが彼らのためであるかどうかを決定します。ご想像のとおり、特に特定のクライアントに送信するだけでよい場合は、大量のネットワークトラフィックが発生する可能性があります。

現在、を使用してTransientSubscriptionsいます。

コードをデバッグしようとしましたが、私が知ることができる唯一のことは、各サブスクライバーが何らかのタイプのジェネリックとして格納されていることCallbackChannelです。

各TransientSubscriberはこのように定義されます。

T subscriber = OperationContext.Current.GetCallbackChannel<T>();

TransientSubscriberを追加すると、これが実行されます。

static void AddTransient(T subscriber, string eventOperation) {
    lock (typeof(SubscriptionManager<T>)) {
        List<T> list = m_TransientStore[eventOperation];
        if (list.Contains(subscriber)) {
            return;
        }
        list.Add(subscriber);
    }
}

より良い方法があれば、私は提案を受け入れます。すべてのクライアントではなく、1つのクライアントに通知を送信したいだけです。

また、ServiceModelExに関するmsdnの記事もあります。

4

2 に答える 2

0

わかりましたので、これが私がやったことです。別の汎用クラスを追加しましたが、これはユーザー ID と汎用 CallbackChannel を保持しています。

public class Subscriber<T> {
    private int _UserID;
    private T _Subscription;

    public int UserID {
        get { return _UserID; }
        set { _UserID = value; }
    }
    public T Subscription {
        get { return _Subscription; }
        set { _Subscription = value; }
    }
}

次に、 T をホールドする ServiceModelEx のすべてのパラメーターを hold に切り替えましたSubscriber<T>。その後、メソッドを介して UserID を渡す新しいFireEvent呼び出しを作成し、UserID を渡すための新しいメソッドも作成しました。そうすれば、そのユーザーの のみが返されます。FireUserEventGetTransientListSubscriber<T>

于 2012-12-13T04:04:48.717 に答える