HttpWebResponse在循环运行时卡住了
我构建此方法(c#)以便从URL接收HTTP响应状态代码。 当我运行这种方法时,它的工作正常,但是当我在一个循环中运行时,它第三次卡住了。 任何线索?
public static string isAlive(string url) { Console.WriteLine("start: Is Alive Test"); WebRequest request = WebRequest.Create(url); try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return Convert.ToString((int)response.StatusCode); } catch(WebException ex) { HttpWebResponse res = (HttpWebResponse)ex.Response; return Convert.ToString((int)res.StatusCode); } }
循环
for (int i = 0; i < 5; i++) { string a = isAlive("https://www.yahoo.com/"); Console.WriteLine(a); }
你没有在HttpWebResponse
对象上调用Dispose
,这意味着连接仍然存在。 如果您将代码更改为以下内容:
public static string isAlive(string url) { Console.WriteLine("start: Is Alive Test"); WebRequest request = WebRequest.Create(url); try { using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { return Convert.ToString((int)response.StatusCode); } } catch(WebException ex) { using(HttpWebResponse res = (HttpWebResponse)ex.Response) { return Convert.ToString((int)res.StatusCode); } } }
using
语句将隐式为您调用Dispose,这将关闭连接。
您的代码在第二次迭代后停止的原因是因为.Net具有内置的最大连接数,它将打开到网站,默认为2.这由System.Net.ServicePointManager.DefaultConnectionLimit
控制,您可以增加你需要吗?
它可能与你没有关闭HttpWebResponse有关。 将finally添加到try try以关闭响应。 还要关闭catch中的WebException响应。
使用“使用”,它将运作良好。
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { return Convert.ToString((int)response.StatusCode); }
- 您需要将
HttpWebResponse
var包装到using
语句中,因为它是一次性的 - 在检查
ex.Response.StatusCode
之前,ex.Response.StatusCode
确保ex.Status是ProtocolError
- 并且还考虑使您的方法异步以进行性能考虑
- 由于您的方法返回状态代码,因此可能有比isAlive更好的名称
样品:
public static async Task GetStatusCode(string url) { var request = (HttpWebRequest)WebRequest.Create(url); try { using (var response = (HttpWebResponse)await request.GetResponseAsync()) { return response.StatusCode.ToString(); } } catch (WebException ex) { return ex.Status == WebExceptionStatus.ProtocolError ? ((HttpWebResponse)e.Response).StatusCode.ToString() : null; } }