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; } }