51

WCF サービスと Web アプリケーションがあります。Web アプリケーションは、この WCF サービスを継続的に呼び出します。つまり、ポーリングです。私たちの実稼働環境では、このエラーが発生することはめったにありません。これは、このエラーがスローされたときにユーザーが認識していなかった内部アクティビティであるためです。

http://localhost/QAService/Service.svcに接続できませんでし た。TCP エラー コード 10048: 通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の 1 つの使用のみが許可されます 127.0.0.1:80。---> System.Net.WebException: リモート サーバーに接続できません ---> System.Net.Sockets.SocketException: 通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の 1 つの使用のみが許可されます 127.0.0.1 :80

dev/qa 環境でこの動作を再現するのに問題があります。クライアント接続が try..catch..finally ブロックで閉じられていることを確認しました。この問題の原因をまだ理解していません..これを知っている人はいますか?

:私はこのSOの質問を見てきましたが、私の問題に答えているようには見えないので、繰り返される質問ではありません。

4

2 に答える 2

84

TCP/IPスタックが過負荷になっています。Windows(および実際にはすべてのソケットスタック)には、通常の操作でソケットがどのように閉じられるかにより、高速シーケンスで開くことができるソケットの数に制限があります。ソケットが閉じられると、一定時間(240秒IIRC)TIME_WAIT状態になります。ポーリングするたびに、ソケットはデフォルトのダイナミックレンジ(1024のすぐ上にある約5000のダイナミックポートだと思います)外で消費され、ポーリングが終了するたびに、その特定のソケットはTIME_WAITに入ります。十分な頻度でポーリングすると、最終的に使用可能なすべてのポートが消費され、TCPエラー10048が発生します。

一般に、WCFは、接続などをプールすることでこの問題を回避しようとします。これは通常、インターネットを経由しない内部サービスの場合です。wsHttpバインディングのいずれかが接続プールをサポートしているかどうかはわかりませんが、netTcpバインディングはサポートする必要があります。名前付きパイプはこの問題に遭遇しないと思います。MSMQバインディングについては言えませんでした。

この問題を回避するために使用できる2つの解決策があります。動的ポート範囲を拡大するか、TIME_WAITの期間を短縮することができます。前者の方がおそらくより安全なルートですが、非常に大量のソケットを消費している場合(シナリオの場合とは異なります)、TIME_WAITを減らすことをお勧めします(または両方を一緒に)。

動的ポート範囲の変更

  1. regeditを開きます。
  2. キーHKLM\System \ CurrentControlSet \ Services \ Tcpip\Parametersを開きます
  3. MaxUserPort値を編集(またはDWORDとして作成)します。
  4. 大きい数値に設定してください。(すなわち65534)

TIME_WAIT遅延の変更

  1. regeditを開きます。
  2. キーHKLM\System \ CurrentControlSet \ Services \ Tcpip\Parametersを開きます
  3. TcpTimedWaitDelayを編集(またはDWORDとして作成)します。
  4. 小さい数値に設定してください。値は秒単位です。(つまり、1分の遅延の場合は60)

上記の解決策のいずれかで問題が解決するはずです。ポート範囲を変更しても問題が解決しない場合は、ポーリングの期間を長くして、発生頻度を減らしてみてください。これにより、待機時間の遅延を回避するための余裕が広がります。最後の手段として、待ち時間の遅延を変更します。

于 2009-08-27T06:41:10.343 に答える
11

HttpClient は、IDisposable を実装していますが、共有オブジェクトですが、インスタンスの数をできるだけ減らす必要があります。リクエストごとに 1 つではなく、アプリケーションの存続期間全体で 1 つのインスタンスのみを使用することで問題を解決できます。

私はhttp://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/でかなり広範囲にそれについて書きました

于 2016-09-01T19:09:15.260 に答える