0

アプリケーション (WPF) の複数のインスタンス間でWCF サービス (クラス)の単一のインスタンスSoapClientを共有するための最良の方法は何ですか?

コールバックとの二重通信を有効にする必要があるため、これを行う必要があります。そのため、アプリケーションを使用する他のユーザーが新しいユーザーがログインするたびに通知を受けるように、サービスに「アプリケーションを登録」する必要があります。


ところで、通知が機能するためには、登録者が同じ wcf サービス インスタンスに登録する必要があることを確認したため、以下は取り消し線が引かれています。したがって、このインスタンスを共有する方法が必要です。

私は現在アプリケーションを開発しており、誰かがアプリケーションにログインするたびに、現在アプリケーションを使用しているユーザーに通知する方法が必要です。

WCF Duplex を使用してみましたが、動作させることができません...そして、その背後にある理由は、通知とサブスクリプションが WCF サービスの同じインスタンスに対して発生する必要があるためだと思います。

しかし、このアプリケーションは複数のユーザーの PC にデプロイされるため、この wcf サービスのインスタンスを 1 つだけ共有することはできません。(または私はできますか?)

SoapClientすべてのユーザーに対してwcf サービス () の共通インスタンスを共有する方法はありますか? それとも、これについて間違った方法で行っていますか?

現在、アクセスするたびにwcfサービスの新しいインスタンスを送信するパブリックプロパティを介して、クラスライブラリを介してWCFサービスにアクセスしています。これが、通知が複数のインスタンスで機能しない理由だと思いますアプリケーション。


以下は、クライアント アプリケーション (wpf アプリ) がサービス メソッドにアクセスするために使用する (クラス ライブラリ内の) メソッドです。

public static MusicRepo_DBAccess_ServiceClient GetService(object instanceContext)
{
    return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(instanceContext), dualBinding, endpointAddress);  
}

public static MusicRepo_DBAccess_ServiceClient GetService()
{
    return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(new WSGateway()), dualBinding, endpointAddress);
}

thisメイン アプリケーション ウィンドウで、instanceContext パラメータとして渡される上記のオーバーロードされたメソッドから新しいインスタンスを取得しOpen、通知を待機しますが、別のユーザーがアプリケーションの別のインスタンスからログインしても通知されません。

これは、サービス ログイン メソッドでレジストラ (抜粋) に通知する方法です。

if (!_callbackList.Contains(newUser))
{
     _callbackList.Add(newUser);
 }
 _callbackList.ForEach(c => c.NotifyNewUserOnline(loggedInUser));

4

1 に答える 1

0

解決策は簡単でした。必要なのは次のように変更InstanceContextModeすることだけでしたSingle

[ServiceBehavior(
        InstanceContextMode = InstanceContextMode.Single)]
于 2009-05-02T11:11:24.797 に答える