httpWebRequest系列

时间:2012-06-14 21:44:45

标签: c# network-programming

我目前正在编写一个简单的应用程序,它会对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保护(不幸的是,服务器对我来说是一个黑盒子)?或者我可能只是不明白这一切是如何运作的?

2 个答案:

答案 0 :(得分:2)

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

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个,但您可以配置),您可以同时进入某个域,请参阅this SO question。您可能会使用未公开的回复达到此限制。

答案 1 :(得分:-1)

首先,我要进行一系列更改,以便找到根源:

  • 取出,试试..catch {}(你可能会吞下一个例外)
  • 返回布尔值而不是数字

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

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

request.Method = "HEAD";

阅读difference here