1

我目前正在编写一个简单的应用程序,它对 Web 服务器执行一系列请求,但我遇到了一个奇怪的......功能?

我不需要请求的响应流,只需要状态码。因此,对于我的每条数据,我调用自己的“发送”方法:

    public static int Send(string uri)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(uri);
            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK) return 0;
        }
        catch (Exception e)
        {
            if (request != null) request.Abort();
        }
        return -1;
    }

工作正常?是的,除非我至少调用这个函数两次。连续第二次调用此类函数(具有相同的 uri)将始终导致超时。

现在,这很奇怪:如果我request.Abort();在返回零时添加(这里,当状态码为 200 时) - 一切总是正常的。

所以我的问题是——为什么?是某种框架限制,还是特定服务器上的某种反 DOS 保护(不幸的是,服务器对我来说是一个黑匣子)?或者,也许我只是不明白这一切是如何运作的?

4

2 回答 2

2

尝试处理网络响应,您可能会泄漏一些资源

public static int Send(string uri)
    {
        HttpWebRequest request = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(uri);
            using (var response = (HttpWebResponse)request.GetResponse())
            {
               if (response.StatusCode == HttpStatusCode.OK) return 0;
            }
        }
        catch (Exception e)
        {
            if (request != null) request.Abort();
        }
        return -1;
    }

还有一个默认连接数(我认为是 2,但您可以配置它)您可以同时连接到域,请参阅这个 SO question。您的未公开回复可能已达到此限制。

于 2012-06-14T21:57:54.823 回答
-1

首先,我会进行一系列更改,以便找到问题的根源:

  • 取出那个 try..catch{} (你可能会吞下一个异常)
  • 返回布尔值而不是数字

然后,您应该获得所需的异常信息。

此外,您应该使用“HEAD”作为您的方法,因为您只需要状态代码:

request.Method = "HEAD";

在这里阅读差异

于 2012-06-14T21:48:23.443 回答