2

次のコードがあります。

using (var fact = new WebChannelFactory<IService<Message>>(binding,
              commsSettings.MessageEndPoint()))
{
    using (IDisposable channel = (IDisposable)fact.CreateChannel())
    {
         service = (IService<Message>)channel;
         service.Create(AlertMessage);
         ((IClientChannel)channel).Close();
    }
    fact.Close();
}

WebChannelFactory とチャネル自体を破棄していますが、接続を開いたままにしています。私がこれを知っているのは、パフォーマンス テストでは、呼び出しが 10 回目の呼び出しでタイムアウトになり、コマンド ラインで netstat -a を実行すると、ポート 80 でローカル マシンとそれ自体の間で多数のソケットが開いていることがわかるからです。

プロキシのソケットを閉じるにはどうすればよいですか?

4

2 に答える 2

2

問題はサーバー側でした。サービス インスタンスごとに signal-R クライアントのリークが発生し、利用可能なソケットが使い果たされました。

それが起こると、クライアントは接続できなくなりました。

同様のものをデバッグしている他の人へのヒント: サーバーを見て、ある種の WCF クライアントを構築しておらず、それらをクリーンアップしていないかどうかを確認してください。この症状は、netstat -a で表示されるソケットが、クライアント プロセスが終了した後も ESTABLISHED 状態のままであるというものでした。

于 2012-05-02T21:34:13.660 に答える
0

残念ながら、マイクロソフトがサービス プロキシ (IClientChannelおよびその継承者) を WCF に実装した方法では、Close/Dispose メソッドで例外が発生する可能性があります。これが発生した場合は、Abort メソッドを呼び出してアンマネージ リソース (この場合は TCP ソケット) を解放する必要があります。この問題に関するこの短いブログ投稿を見て、usingステートメントの代わりに説明されている破棄パターンを実装してください。

于 2012-05-01T19:21:55.823 に答える