プロキシ要求の間で HttpWebRequest の応答を破棄する
従来の HttpWebRequest の応答に明確な有効期間を与え、繰り返されるプロキシ要求が接続リソースを無期限に保持しないようにします。
using (WebResponse response = request.GetResponse())
{
response.GetResponseStream().CopyTo(destination);
}
従来の HttpWebRequest の応答をそれぞれ、消費を終えて解放するスコープ内に保ちます。ここで destination はアプリケーションの書き込み可能な出力ストリームです。using ブロックは、コピーが失敗しても WebResponse を解放し、その出力の所有権を引き継ぎません。
プロキシ要求が成功し、後続が待機する場合、未完了の応答が接続リソースを占有している可能性があります。WebResponse を受け取るだけでは本体は完了しません。要求のタイムアウトが制限するのは待機時間であり、すでに取得した各応答の有効期間ではありません。
エラーにも同じ所有権を適用します。WebException はコードが検査する応答を運ぶことがあります。検査後に閉じてください。転送の失敗には応答がまったくないこともあります。
破棄は応答のリソースを解放しますが、すべての場合で再利用可能な接続を約束するものではありません。プロトコル、サーバー、本体の消費は依然として重要です。
これは従来の WebRequest スタックの保守に関するものです。新しいコードでは実際のクライアントの応答/ストリームの所有権に従ってください。HttpClient では、応答をその破棄スコープ内に保ち、このクリーンアップの失敗をプロキシ認証やルート選択と区別してください。