呼び出しごとに新しいプロキシ インスタンスを作成する WCF クライアント アプリがあります。前のインスタンスで Close() を呼び出して、接続が確実に閉じられるようにしますが、常に 1 分後にタイムアウトになります。これはデフォルトのクローズ時間です。この場合、以前に Close() ではなく Abort() を呼び出しましたが、その後、デフォルトの制限である 10 同時接続を超えることに気付きました。Close() 呼び出しがタイムアウトする原因がわかりません。WCF トレース ログを見ると、次のようなログのセクションが表示されますが、それが Close() を呼び出した結果なのか、それとも何かが自動的にこれを行った結果なのかは明確ではありません。
- メッセージが閉じられました
- メッセージが閉じられました
- メッセージが再び閉じられました
私のサービスには、次の動作が定義されています。
[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
以下は私のサービスの振る舞いです:
<service behaviorConfiguration="AdminServiceBehavior" name="My.WebServices.AdminService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="AdminUserNameBinding"
name="wsHttpBindingWithAuthAdmin" contract="My.WebServices.IAdminService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" name="mexAdminBinding"
contract="IMetadataExchange" />
タイムアウトせずに接続を適切に Close() するにはどうすればよいですか? Close() と Abort() をいつ呼び出すかについての記事を読んだことがありますが、「using」ブロックを破棄/使用する必要がある場合は、Close() がタイムアウトし、Abort() が解放されないという事実同時セッションを開始すると、私は困惑します。
これはAutomataticSessionShutdownに関係している可能性がありますが、なぜ Close() が中止されるのかわかりません。正直なところ、なぜそのプロパティを false に設定しているのかわかりません。
更新: AutomaticSessionShutdown を true (デフォルト値) に設定すると、タイムアウトせずに Close() を呼び出すことができます。これはうまくいくようですが、理由はわかりません。