まず、既定では、WCFサービスは「要求ごとのインスタンス」構造であることを理解してください。 IISがアプリケーションプール内で管理するHttpApplicationsは、サービス契約クラスのコピーを「新規作成」し、要求に関連した呼び出しを行い、その後オブジェクトは有効範囲外になり破棄されます。もし、あなたのサービスは、「インスタンス・セッションごと」モードで実行する必要があることを示すことによって、これをオーバーライドすることができます。
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyServiceContract
{
...
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyServiceImplementation: IMyServiceContract
{
...
}
今、あなたのサービスが呼び出されたときに、「セッション」は、クライアントとサーバの間で確立され、単一クラスのコピーが作成され、そのセッションの存続期間(アプリケーションプールがリフレッシュされない限り、自動的にまたはIIS内の手動アクションで発生しない限り)に記憶されます。これが最初のステップです。
さて、あなたは、2つのいずれかの操作を行うことができます
は単にConnectが()の創設以来、このインスタンスで呼び出されたかどうかを接続します()以外のいずれかの方法でご確認ください。そうでなければ、投げ捨てる。
Connect()メソッドは、クライアントが他のすべてのメソッド呼び出しに渡す必要があるインスタンススコープのトークンまたはGUIDを返します。呼び出し側が提供するGUIDがインスタンスメモリに保持されているGUIDと一致しない場合は、メソッドを終了します。
セッションがリクエスト間でタイムアウトする可能性があることを理解してください。この場合、現在のインスタンスはスコープを離れて破棄され、後続の要求を処理するための新しいインスタンスが作成されます。したがって、システムがセッションに基づいてインスタンスを識別できる場合でも、私は2番目のオプションを選択します。 GUIDは、最後の呼び出し以降にクライアントとサービスの両方のインスタンスが変更されていないことを確認します。
** 1)** 2番目のオプションに関して、なぜクライアントまたはサービスインスタンスが変更できますか? ** 2)**セッションはリクエスト間でタイムアウトする可能性があるので、このタイムアウトを変更できますか?また、手動でセッションを終了できますか? Disconnectメソッドを 'IsTerminating'プロパティを' true'に設定して、セッションを手動で終了できますか? ** 3)**接続を拒否する必要がある場合、どのようにTCPセッションを閉じることができますか? – enzom83
1)サービスがタイムアウトすると、サービスインスタンスが変更されることがあります。 Webサービスの基本的なアーキテクチャは、クライアントがこれが起こったかどうかを知ることができないかもしれないが、この場合には必要であることを意味する。 2)はい、タイムアウトを変更できます。手動でセッションを終了することもできます。 3)Webサービスがスローされた場合、TCP接続は終了します。 – KeithS