HttpWebResponse gets stuck while working in a loop

I am creating this method (C #) to get an HTTP response status code from a URL. When I run this method, it works fine, but when I run it in a loop, it gets stuck a third time. any key?

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

cycle

        for (int i = 0; i < 5; i++)
        {
            string a = isAlive("https://www.yahoo.com/");
            Console.WriteLine(a);
        }
+4
source share
4 answers

You are not calling the Disposeobject HttpWebResponse, which means that the connection is still lying. If you change your code to the following:

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

The statement usingindirectly calls Dispose for you, which closes the connection.

, , , .Net , -, 2. System.Net.ServicePointManager.DefaultConnectionLimit, , .

+8

, HttpWebResponse. , , catch, . WebException catch.

0

"using", .

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            return Convert.ToString((int)response.StatusCode);
        }
0
  • HttpWebResponse var using,
  • Before checking, ex.Response.StatusCodemake sure that ex.Status isProtocolError
  • And also consider making your method asynchronous for performance reasons.
  • Since your method returns a status code, there might be a better name for it than isAlive

Example:

public static async Task<string> 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;
    }
}
0
source

Source: https://habr.com/ru/post/1527857/


All Articles