2010-10-11 64 views
6

我有一个应用程序,蜘蛛网站的信息。看起来像创建HttpWebRequests 20-45分钟后,他们一堆返回超时。我们所做的一件事就是附上一个匿名函数BindIPDelegate,为这个请求提供一个特定的IP,因为我们循环了大约150个IP。做了HttpWebRequests一段时间后,结果开始超时

我设置了以下设置HttpWebRequest对象..

  • 设置的User-Agent
  • 设置保持活动为false,这样不会重复使用的IP
  • 设置超时到60000(60秒)
  • 设置ReadWriteTimeout到60000(60秒)
  • 设置代理为null
  • Setti NG接受以/
  • 设置的CookieContainer新的CookieContainer
  • 设置Piplined为true
  • 设置自动减压放气& GZIP

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

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

任何想法?

+0

你在做异步回叫或等待电话吗? – WeNeedAnswers 2010-10-19 22:53:00

+0

同步,阻止呼叫。 – 2010-10-20 21:09:02

+0

尝试异步回叫。可能无法解决您的问题,但他们确实在使用httpWebRequest时理清了线程的头痛问题。我会说它与线程池有关,但没有看你的代码,我不能肯定地说。永远不会伤害异步回调,而不是启动线程。你使用线程池? – WeNeedAnswers 2010-10-21 00:22:00

回答

6

你不说很多关于你的实际使用来执行请求,但,反正代码,这里是我的猜测:

  1. 您正在使用BeginGetResponse()/EndGetResponse()有回调,回调的时间太长完成(或阻止!)。如果您在短时间内发出大量请求,这可能会导致线程池发生死锁。因为你不重复使用连接,并且,如果请求发生得非常快并且不停止,那么你可能会用尽套接字(上次我尝试过,每个接口在windows上约3k)。如果将KeepAlive设置为true可以修复您的问题,就是这样。

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

顺便说一句,设置保持活动为false,流水线真没有什么意义。

+0

诊断端口耗尽的简单方法是使用'netstat'。 – 2010-10-20 19:34:06

+0

@Steven:是的,在Linux中我会做一些像“netstat -nt”。如果有很多CLOSE_WAIT,那么就是上面的情况3。如果有很多TIME_WAIT,那么将会是上面的情况2。增加'ulimit -n'将有助于案例2,但案例3是一个应用程序问题。 – Gonzalo 2010-10-20 19:37:36

+0

Windows有内置的Unix命令行工具的移植版本。但是,虽然有一对注册表项可用于调整端口限制,但正确的答案仍然是修复代码,以便重新使用端口。 – 2010-10-20 19:45:07

0

难道它是远程端的IDS,认为你是攻击者并阻止你?

+0

难道它不会继续阻止我吗?看起来它发生的时间很短,然后消失。 – 2010-10-11 17:18:54

+0

取决于设置 - 您可以配置多长时间来阻止感知的攻击 – arootbeer 2010-10-12 00:51:35

+0

是否可以在服务器上运行任何诊断程序 - 例如,TCPView查看什么是中断连接等? – 2010-10-16 17:02:51

1

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

0

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

+0

IDisposable的所有内容都包含在using语句中。 – 2010-10-18 18:15:32

0

更容易显示我在评论中的含义,而不是我自己的工作,但微软的人做了这么好的工作,我将链接传递给你。

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

如果你做的通过HTTP重输入输出,我总是建议在看回调机制。

还要确保关闭那些该死的httpWebRequest对象。通过使用“使用”语句宽泛地将所有东西包装在泡沫包装塑料中。

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

我碰到指的web服务也可能会影响你的问题,产生的原因是非常相似的,继承人的链接的文章:

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

0

尝试添加以下到您的app.config,下方配置标签。我认为这解决了类似的问题,反复做了很多的HTTP连接的,当我有:

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

编辑:我觉得defaultProxy -tag是真的,真的很重要标签。

相关问题