4

我构建此方法 (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);
        }
4

4 回答 4

10

您没有调用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);
       }
   }
}

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

您的代码在第二次迭代后停止的原因是因为 .Net 有一个内置的最大连接数,它将打开到一个网站,默认情况下为 2。System.Net.ServicePointManager.DefaultConnectionLimit如果需要,您可以通过它来控制它。

于 2014-02-20T09:49:40.840 回答
1
  • 您需要将HttpWebResponsevar 包装到using语句中,因为它是一次性的
  • 在检查之前ex.Response.StatusCode确保 ex.Status 是ProtocolError
  • 并考虑使您的方法异步以考虑性能
  • 由于您的方法返回状态代码,因此它的名称可能比 isAlive 更好

样本:

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;
    }
}
于 2014-02-20T09:56:56.343 回答
0

这可能与您没有关闭 HttpWebResponse 有关。将 finally 添加到关闭响应的 try catch 中。还要在 catch 中关闭 WebException 响应。

于 2014-02-20T09:52:06.990 回答
0

使用“使用”,它会很好地工作。

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            return Convert.ToString((int)response.StatusCode);
        }
于 2014-02-20T09:53:00.827 回答