在做了一段时间的HttpWebRequests之后,结果开始超时

时间:2010-10-11 17:13:50

标签: c# .net networking windows-server-2008 web-crawler

我有一个应用程序,蜘蛛网站的信息。似乎在创建HttpWebRequests 20-45分钟之后,他们中的一大堆返回超时。我们做的一件事就是附加一个BindIPDelegate匿名函数来为请求提供特定的IP,因为我们循环访问了大约150个IP。

我正在使用以下设置设置HttpWebRequest对象..

  • 设置用户代理
  • 将Keep-Alive设置为false,以便不重复使用IP
  • 将TimeOut设置为60000(60秒)
  • 将ReadWriteTimeout设置为60000(60秒)
  • 将代理设置为空
  • 将接受设置为 /
  • 将CookieContainer设置为新的CookieContainer
  • 将Piplined设为true
  • 将自动解压缩设置为放气& GZIP

该应用程序使用的是.NET 4.0并在Windows Server 2008 R2上运行。

这绝对看起来像应用程序/ TCP / .NET相关,因为如果我重新启动应用程序它再次运行正常。此外,它似乎或多或少像超时排队等待本地端口等等。

有什么想法吗?

6 个答案:

答案 0 :(得分:6)

您对实际用于执行请求的代码没有太多说明,但无论如何,这是我的猜测:

  1. 您正在使用BeginGetResponse()/EndGetResponse()进行回调,并且回调需要很长时间才能完成(或阻止!)。如果您在很短的时间内发出大量请求,这可能会导致线程池出现死锁。

  2. 由于您没有重复使用连接,并且,如果请求发生得非常快且不间断,您可能会用完套接字(上次我尝试过,每个接口在Windows上大约3k)。如果将KeepAlive设置为true可以解决您的问题,那就是它。

  3. 您没有在HttpWebRequest或HttpWebResponse上调用Dispose()/Close()或从响应中获取Stream。在您的应用程序配置设置( system.net/connectionManagement/add [address =“*”]中达到2(来自MSDN文档)或6(配置文件默认值)的限制之前,这可能会有所帮助。 ,MAXCONNECTION = “6”] )。测试这是否是问题的一种简单方法是将限制设置为1并查看问题是否比以前更早发生。

  4. 顺便说一句,将 KeepAlive 设置为false并将 Pipelined 设置为true是没有意义的。

答案 1 :(得分:1)

我猜这是由于ThreadPool相关的问题。

答案 2 :(得分:0)

可能是远程端的IDS认为你是攻击者并阻止你吗?

答案 3 :(得分:0)

我的猜测是,可能并非所有对象都正确处理,并且某些TCP端口保持打开状态。试着看看哪些对象实现了IDisposable。至少GetResponse和GetResponseStream的结果是IDisposables,应该正确处理。

答案 4 :(得分:0)

更容易展示我在评论中的意思,而不是我自己的工作,但微软的工作人员做了这么好的工作,我把链接传给你。

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

如果您通过http进行大量输入输出,我总是会建议查看回调机制。

还要确保关闭那些该死的httpWebRequest对象。用大量的“使用”语句将所有东西包裹在气泡包装塑料中。

多线程操作:每个主机连接的默认设置为2个连接 该设置可以更改。如果正在使用最大连接数,则HttpWebRequest操作(请求/响应)将排队,直到连接槽可用。

我遇到的文章引用webservices也可能会影响你的问题,因为原因非常相似,这是一个链接:

http://support.microsoft.com/kb/821268

答案 5 :(得分:0)

尝试将以下内容添加到配置标记下方的app.config中。我认为这解决了我在重复进行大量http连接时遇到的类似问题:

  <system.net>
    <defaultProxy enabled="false">
    </defaultProxy>
    <connectionManagement>
      <remove address="*"/>
      <add address="*" maxconnection="1000" />
    </connectionManagement>
  </system.net>

编辑:我认为 defaultProxy -tag是真正非常重要的标签。