代码之家  ›  专栏  ›  技术社区  ›  Chad Moran

在执行HttpWebRequests一段时间后,结果开始超时

  •  6
  • Chad Moran  · 技术社区  · 14 年前

    BindIPDelegate 匿名函数给请求一个特定的IP,因为我们循环访问大约150个IP。

    我正在设置 HttpWebRequest

    • 将Keep Alive设置为false,这样就不会使用IP
    • 将超时设置为60000(60秒)
    • 将ReadWriteTimeout设置为60000(60秒)
    • 将代理设置为空
    • 设置接受为 /
    • 将CookieContainer设置为新CookieContainer
    • 将Piplined设置为true

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

    这看起来确实与application/TCP/.NET有关,因为如果我重新启动应用程序,它将再次正常运行。同时,它似乎或多或少地像那些超时的只是排队等待本地端口或其他东西。

    6 回复  |  直到 14 年前
        1
  •  6
  •   Gonzalo    14 年前

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

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

    2. 由于您没有重用连接,而且,如果请求发生得非常快且不停,您可能会耗尽套接字(上次我尝试时,windows上的每个接口大约3k个)。如果将KeepAlive设置为true可以解决您的问题,这就是问题所在。

    3. Dispose()/Close() 在HttpWebRequest、HttpWebResponse或从响应中获取的流上。在应用程序配置设置中达到2(来自MSDN文档)或6(配置文件默认值)的限制之前,这可能会有一点作用( system.net/connectionManagement/add[地址=“*”,最大连接=“6”] ). 测试这是否是问题的一个简单方法是将限制设置为1,并查看问题是否比以前更早发生。

    顺便说一下,设置 持久连接 错误和 真的没有道理。

        2
  •  1
  •   Sudesh Sawant    14 年前

        3
  •  0
  •   Yuliy    14 年前

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

        4
  •  0
  •   Pieter van Ginkel    14 年前

    我的猜测是,可能并不是所有的对象都被正确地释放,而且一些TCP端口保持打开状态。尝试查看哪些对象实现IDisposable。至少GetResponse和GetResponseStream的结果是IDisposables,应该正确处理。

        5
  •  0
  •   WeNeedAnswers    14 年前

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

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

    如果您通过http进行大量输入输出,我建议您考虑回调机制。

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

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

        6
  •  0
  •   Onkelborg    14 年前

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

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

    编辑: 我认为 默认代理