HttpWebResponse在循环运行时卡住了

use*_*976 4 .net c# webrequest httpwebresponse getresponse

我构建此方法(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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

循环

        for (int i = 0; i < 5; i++)
        {
            string a = isAlive("https://www.yahoo.com/");
            Console.WriteLine(a);
        }
Run Code Online (Sandbox Code Playgroud)

Cei*_*ish 8

你没有调用Dispose这个HttpWebResponse对象,这意味着连接仍然存在.如果您将代码更改为以下内容:

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);
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

using语句将隐式为您调用Dispose,这将关闭连接.

您的代码在第二次迭代后停止的原因是因为.Net具有内置的最大连接数,它将打开到网站,默认情况下为2.这是System.Net.ServicePointManager.DefaultConnectionLimit您可以根据需要增加的控制.