我有一个应用程序,蜘蛛网站的信息。似乎在创建HttpWebRequests 20-45分钟之后,他们中的一大堆返回超时。我们做的一件事就是附加一个BindIPDelegate
匿名函数来为请求提供特定的IP,因为我们循环访问了大约150个IP。
我正在使用以下设置设置HttpWebRequest
对象..
该应用程序使用的是.NET 4.0并在Windows Server 2008 R2上运行。
这绝对看起来像应用程序/ TCP / .NET相关,因为如果我重新启动应用程序它再次运行正常。此外,它似乎或多或少像超时排队等待本地端口等等。
有什么想法吗?
答案 0 :(得分:6)
您对实际用于执行请求的代码没有太多说明,但无论如何,这是我的猜测:
您正在使用BeginGetResponse()/EndGetResponse()
进行回调,并且回调需要很长时间才能完成(或阻止!)。如果您在很短的时间内发出大量请求,这可能会导致线程池出现死锁。
由于您没有重复使用连接,并且,如果请求发生得非常快且不间断,您可能会用完套接字(上次我尝试过,每个接口在Windows上大约3k)。如果将KeepAlive设置为true可以解决您的问题,那就是它。
您没有在HttpWebRequest或HttpWebResponse上调用Dispose()/Close()
或从响应中获取Stream。在您的应用程序配置设置( system.net/connectionManagement/add [address =“*”]中达到2(来自MSDN文档)或6(配置文件默认值)的限制之前,这可能会有所帮助。 ,MAXCONNECTION = “6”] )。测试这是否是问题的一种简单方法是将限制设置为1并查看问题是否比以前更早发生。
顺便说一句,将 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也可能会影响你的问题,因为原因非常相似,这是一个链接:
答案 5 :(得分:0)
尝试将以下内容添加到配置标记下方的app.config中。我认为这解决了我在重复进行大量http连接时遇到的类似问题:
<system.net>
<defaultProxy enabled="false">
</defaultProxy>
<connectionManagement>
<remove address="*"/>
<add address="*" maxconnection="1000" />
</connectionManagement>
</system.net>
编辑:我认为 defaultProxy -tag是真正非常重要的标签。