Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行HttpWebRequests一段时间后,结果开始超时_C#_.net_Networking_Windows Server 2008_Web Crawler - Fatal编程技术网

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

C# 执行HttpWebRequests一段时间后,结果开始超时,c#,.net,networking,windows-server-2008,web-crawler,C#,.net,Networking,Windows Server 2008,Web Crawler,我有一个应用程序可以在网站上搜索信息。在创建HttpWebRequests 20-45分钟后,似乎有很多请求返回超时。我们要做的一件事是附加一个bindipdegate匿名函数,为请求提供一个特定的IP,因为我们通过大约150个IP进行循环 我正在使用以下设置设置HttpWebRequest对象 设置用户代理 将Keep Alive设置为false,这样IP就不会被重复使用 将超时设置为60000(60秒) 将ReadWriteTimeout设置为60000(60秒) 将代理设置为null 将

我有一个应用程序可以在网站上搜索信息。在创建HttpWebRequests 20-45分钟后,似乎有很多请求返回超时。我们要做的一件事是附加一个
bindipdegate
匿名函数,为请求提供一个特定的IP,因为我们通过大约150个IP进行循环

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

  • 设置用户代理
  • 将Keep Alive设置为false,这样IP就不会被重复使用
  • 将超时设置为60000(60秒)
  • 将ReadWriteTimeout设置为60000(60秒)
  • 将代理设置为null
  • 将接受设置为/
  • 将CookieContainer设置为新CookieContainer
  • 将Piplined设置为true
  • 将自动解压缩设置为放气&GZIP
该应用程序正在使用.NET 4.0并在Windows Server 2008 R2上运行

这显然与application/TCP/.NET相关,因为如果我重新启动应用程序,它会再次正常运行。而且,它看起来或多或少像那些超时的人只是在本地端口或其他地方排队等待


有什么想法吗?

远程端的ID会认为你是攻击者并阻止你吗?

我猜这是由于线程池相关的问题。

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

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

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

  • 因为您没有重用连接,而且,如果请求发生得非常快且不间断,您可能会用完套接字(上次我尝试时,windows上每个接口大约3k)。如果将KeepAlive设置为true可以解决您的问题,那么就是这样

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


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

    更容易显示我在评论中的意思,而不是我自己的工作,但是微软的员工做得很好,我将链接传递给了你

    如果您通过http进行大量输入输出,我总是建议您研究回调机制

    还要确保关闭那些该死的httpWebRequest对象。用泡沫塑料将所有东西包裹起来,自由地使用“使用”语句

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

    我看到的一篇关于webservices的文章也可能会影响您的问题,因为原因非常相似,这里有一个链接:


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

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

    编辑:我认为defaultProxy标记是非常非常关键的标记。

    它不会继续阻止我吗?它似乎会在短时间内发生,然后消失。取决于设置-您可以配置要阻止感知攻击的时间-您是否能够在服务器上运行任何诊断-例如,TCPView查看是什么中断了连接等?IDisposable的所有内容都包装在using语句中。您是在执行异步回调还是在等待调用?请尝试异步回调。可能无法解决您的问题,但它们确实解决了使用httpWebRequest时线程的头痛问题。我想说它与线程池有关,但如果不看你的代码,我就不能肯定了。执行异步回调而不是启动线程从来都没有坏处。你在使用线程池吗?诊断端口耗尽的简单方法是使用
    netstat
    。@Steven:是的,在linux中,我会做一些类似“netstat-nt”的事情。如果有大量的关闭等待,这将是上述情况3。如果等待的时间很长,则为上述情况2。增加“ulimit-n”将有助于案例2,但案例3是一个应用程序问题。Windows内置了Unix命令行工具的移植版本。然而,尽管有一对注册表项可用于调整端口限制,正确的答案仍然是修复代码,以便重用端口。作为解释,管道化意味着在同一连接上发送多个请求,而无需等待第一个响应。由于KeepAlive意味着它不应该使用重用连接,因此它会使管道连接无效。通过手动设置HttpWebRequest的ServicePoint,您可以获得所需的所有控制(或多或少)。