在代理请求之间释放 HttpWebRequest 响应
为旧式 HttpWebRequest 响应设定清晰的生命周期,使重复的代理请求不会无限期占用连接资源。
using (WebResponse response = request.GetResponse())
{
response.GetResponseStream().CopyTo(destination);
}
让每个旧式 HttpWebRequest 响应都位于一个完成消费并释放它的作用域中。这里的 destination 是应用程序可写的输出流;即使复制失败,using 块也会释放 WebResponse,而不会接管该输出流的所有权。
一个代理请求成功而后续请求等待,可能意味着未完成的响应正占用连接资源。仅仅收到 WebResponse 并不会结束其正文。请求超时限制的是等待时间,而不是每个已获得响应的生命周期。
对错误也应用同样的所有权规则。WebException 可能携带你的代码要检查的响应;检查后应将其关闭。传输失败可能根本没有响应。
释放会归还响应的资源,但并不保证在每种情况下都能复用连接。协议、服务器和正文消费仍然重要。
这涉及旧式 WebRequest 堆栈的维护。在较新的代码中,应遵循实际客户端的响应/流所有权;对于 HttpClient,将响应保留在其释放作用域内,并把这类清理故障与代理身份验证或路由选择区分开。