リクエストの間に物を保存する必要がある場合は、これらのリクエストを受信時に保存するための適切なロックを備えた静的ディクショナリを作成するか、この情報をデータベース(または他の外部ストア)に保存して確認する必要があります各メソッド呼び出しに存在します。これは、クライアントの要求ごとにサービスクラスがインスタンス化されるためです。
ユーザーがサービスにアクセスしたときにユーザーの日時を既に更新しているので、日時フィールドと比較して、これがアクティブユーザーであるかどうかを確認することをお勧めします。これには、すべての呼び出しで正確であるという利点があります(サービスが再起動されると、ディクショナリがデータベースと同期しなくなる可能性があります)。データベースには、同時実行性を処理するためのメカニズムがすでに用意されているため、シングルトンオブジェクトの周りに独自のロックソリューションをロールバックするのではなく、複雑さをデータストアにプッシュできます。
2番目のソリューションが十分に高速でない場合(アプリのプロファイルを作成し、それがボトルネックであると判断した場合)、他のオプションは、データベースの前にある種のキャッシュソリューションを使用して、データを最初にメモリでチェックしてから移動することです。データベースに。このキャッシュオブジェクトは、ディクショナリのように静的である必要があり、他のマルチスレッドアプリケーションと同じようにロックに関する落とし穴があります。
編集:このホストされたWCFサービスがSilverlightアプリケーションのユーザーのセッションストレージとして使用されており、データが外部データストアに保存されていない場合は、それらがアクティブであるかどうかの追跡がミッションクリティカルではないことを確認してください。このデータは、説明されているように正しいことを保証することはできません。
サービスに障害が発生して再起動する必要がある場合は、受け入れられた回答に基づいて(これはセルフホストであるため、障害が発生したイベントを監視することをお勧めします)、サービスホストを破棄し、新しいホストをインスタンス化する必要があります。Guidデータを保持できる唯一の方法は、再起動の間にサービスにリバウンドする場合です(ホストアプリ自体が再起動されないと仮定すると、これは別の問題です)。
private Dictionary<Guid,string> _session;
Service service = new Service(_session);
_serviceHost = new ServiceHost(service, GetUriMethodInHostApp());
これを外部に保存し、@marc_sが示唆するようにルックアップを実行することをお勧めします。その後、この複雑さはなくなります。