WCF サーバーと通信している WPF アプリケーションがあります。
1 つの ChannelFactory を使用して、呼び出しごとにチャネルを作成しています。
var channel = _channelFactory.CreateChannel();
var contextChannel = channel as ICommunicationObject;
try
{
channel.DoSomething();
}
catch (Exception)
{
contextChannel?.Abort();
throw;
}
finally
{
contextChannel?.Close();
}
アプリケーションの起動時にサーバーに多くの要求があり、ある時点で停止してタイムアウトになります。netstat を見ると、サーバーへの接続が確立されていることがわかります。
ServicePointManager.DefaultConnectionLimit を 10 に変更すると、サーバーへの呼び出しをさらに処理できますが、しばらくするとタイムアウト例外が発生して停止します。
ServicePointManager.DefaultConnectionLimit を int.MaxValue に設定すると、すべてのリクエストが処理されますが、サーバーへの ESTABLISHED 接続が約 720 あります (サーバーの netstat で同じ結果が得られます)。
私はここで2つのことについて混乱しています:
- WCFは接続をプールしていないようですが、リクエストごとに新しい接続を作成しています
- チャネルを閉じた後でも、接続は確立されたままのようです。
ServicePointManager.FindServicePoint(new Uri(" https://server:3000 "));も確認しました。そして、CurrentConnections が ServicePointManager.DefaultConnectionLimit として設定した制限に達していることを確認します。
ServicePointManager.MaxServicePointIdleTime を 500 に減らしました。これにより、接続がより速く閉じられますが、呼び出すたびに接続が作成されます。
サーバーと通信するときに既存のチャネルを再利用するようにチャネル ファクトリを説得するにはどうすればよいですか。
これは私のバインディングです:
new WebHttpBinding
{
TransferMode = TransferMode.Streamed,
ReceiveTimeout = TimeSpan.FromMinutes(1),
SendTimeout = TimeSpan.FromMinutes(1),
MaxReceivedMessageSize = 2147483647,
MaxBufferPoolSize = 2147483647,
ReaderQuotas =
{
MaxDepth = 2147483647,
MaxStringContentLength = 2147483647,
MaxArrayLength = 2147483647,
MaxBytesPerRead = 2147483647,
MaxNameTableCharCount = 2147483647
},
Security = new WebHttpSecurity() { Mode = WebHttpSecurityMode.Transport, Transport = new HttpTransportSecurity() { ClientCredentialType = HttpClientCredentialType.None } }
};