0

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つのことについて混乱しています:

  1. WCFは接続をプールしていないようですが、リクエストごとに新しい接続を作成しています
  2. チャネルを閉じた後でも、接続は確立されたままのようです。

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 } }
};
4

1 に答える 1