繁体   English   中英

系列的httpWebRequests

[英]series of httpWebRequests

我当前正在编写一个简单的应用程序,该应用程序向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保护(不幸的是,服务器对我来说是一个黑匣子)? 或者,也许我只是不了解其工作原理?

尝试处理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,但您可以配置它),请参阅此SO问题 您未完成的回复可能会达到此限制。

首先,我将进行一系列更改以了解其根源:

  • 删除 try..catch {}(您可能会吞下一个异常)
  • 返回布尔值而不是数字

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

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

request.Method = "HEAD";

这里阅读区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM