コールバックを介して通信が行われ、InstanceContextMode が PerSession である WCF、tcp ベースのクライアント サーバー アプリケーション (自己ホスト型) があります。管理者が接続されているすべてのユーザーの詳細を表示し、ある程度の管理制御 (セッションの強制切断など) を提供できるようにする、このアプリに管理者インターフェイスを提供したいと考えています。
コールバックを使用しているため、各クライアント プロキシは、コンストラクターを介してサーバーにインスタンス コンテキストを提供します。たとえば、クライアントは次を使用してサーバーへのプロキシをインスタンス化します。
public class ClientCallbackHandler : IMyServerCallback
{
proxy = new MyServiceClient(new InstanceContext(this));
サーバー側では、次を使用してこのコンテキストを取得します。
var currenContext = OperationContext.Current;
私の最初の考えは、OperationContext オブジェクトのコレクションを維持する (つまり、接続された各クライアントのコンテキストへの参照を保持する) シングルトン 'SessionAdmin' クラスを実装することでした。新しいクライアント セッションはすべて「SessionAdmin」クラスの同じインスタンスに登録されるため、すべてのクライアント セッションにアクセスできる中心的なクラスが提供されます。
これはある程度機能しますが、「OperationContext」オブジェクトのコレクションにアクセスしてクライアントの詳細を取得したり、他の操作を実行したりするさまざまな時点で、コンテキストが「オブジェクト破棄」例外をスローしていることに気付きます。
私の質問は、まず、上記は WCF セッションに対するサーバー側の管理制御を提供する合理的な方法のように聞こえますか? もしそうなら、それらのオブジェクトを破棄せずにサーバー側でクライアントセッションまたはそのコンテキストのコレクションを維持するにはどうすればよいですか? 問題の例は次のとおりです。
foreach(var context in MyContextCollection)
{
DisplayClientDetails(context);
...
}
public void DisplayClientDetails(OperationContext context)
{
var sessionID = context.SessionId; //No problem here
var user = context.ServiceSecurityContext.PrimaryIdentity.Name; //ServiceSecurityContext has been disposed