C# 执行HttpWebRequests一段时间后,结果开始超时
我有一个应用程序可以在网站上搜索信息。在创建HttpWebRequests 20-45分钟后,似乎有很多请求返回超时。我们要做的一件事是附加一个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 将
bindipdegate
匿名函数,为请求提供一个特定的IP,因为我们通过大约150个IP进行循环
我正在使用以下设置设置HttpWebRequest
对象
- 设置用户代理
- 将Keep Alive设置为false,这样IP就不会被重复使用
- 将超时设置为60000(60秒)
- 将ReadWriteTimeout设置为60000(60秒)
- 将代理设置为null
- 将接受设置为/
- 将CookieContainer设置为新CookieContainer
- 将Piplined设置为true
- 将自动解压缩设置为放气&GZIP
有什么想法吗?远程端的ID会认为你是攻击者并阻止你吗?我猜这是由于线程池相关的问题。我猜可能不是所有对象都被正确处理,一些TCP端口保持打开状态。尝试查看哪些对象实现IDisposable。至少GetResponse和GetResponseStream的结果是IDisposables,应该正确处理。您没有说太多关于实际用于执行请求的代码的内容,但是,无论如何,我猜:
BeginGetResponse()/EndGetResponse()
与回调一起使用,而回调需要太长时间才能完成(或阻塞!)。如果您在短时间内发出大量请求,这可能会导致线程池中出现死锁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,您可以获得所需的所有控制(或多或少)。