2011-11-07 21 views
0

いくつかの方法でWCFサービスを作成します。これらのメソッドの1つ(Connectメソッド)は、サービスを使用するために最初に呼び出される必要があります。つまり、他のすべてのサービスメソッドを使用する前に、Connectメソッドと呼びます。このため、IsInitiatingプロパティをtrueに設定して定義しました。このプロパティをfalseに設定して他のメソッドを定義しました。サービスへの接続を拒否する

さらに、サービスを提供するノードは、他のノードからの接続要求を拒否できなければなりません(たとえば、他のノードが既にサービスを使用している場合など)。

ありがとうございます!

答えて

1

まず、既定では、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は、最後の呼び出し以降にクライアントとサービスの両方のインスタンスが変更されていないことを確認します。

+0

** 1)** 2番目のオプションに関して、なぜクライアントまたはサービスインスタンスが変更できますか? ** 2)**セッションはリクエスト間でタイムアウトする可能性があるので、このタイムアウトを変更できますか?また、手動でセッションを終了できますか? Disconnectメソッドを 'IsTerminating'プロパティを' true'に設定して、セッションを手動で終了できますか? ** 3)**接続を拒否する必要がある場合、どのようにTCPセッションを閉じることができますか? – enzom83

+1

1)サービスがタイムアウトすると、サービスインスタンスが変更されることがあります。 Webサービスの基本的なアーキテクチャは、クライアントがこれが起こったかどうかを知ることができないかもしれないが、この場合には必要であることを意味する。 2)はい、タイムアウトを変更できます。手動でセッションを終了することもできます。 3)Webサービスがスローされた場合、TCP接続は終了します。 – KeithS

関連する問題