我创建了一个从HTTP请求加载数据的程序。 它必须每隔1秒或0.25秒加载 。
然而,我发现我的许多请求 - 每分钟都有一些 - 超时了。 这很奇怪,因为尝试在Web浏览器中重新加载相同的地址,即使经常重新加载,我总是快速获取内容。
这是我使用的代码:
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
myRequest.Timeout = 1500;
myRequest.KeepAlive = false;
myRequest.ContentType = "text/xml";
WebResponse myResponse;
try
{
myResponse = myRequest.GetResponse();
}
catch (Exception e)
{
return e.Message;
}
StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string result = sr.ReadToEnd();
sr.Close();
myResponse.Close();
我得到的错误是:
The operation has timed out
我尝试将keepalive设置为true和false。
所以问题是 - 有没有办法减少超时量?我要求的每个请求都至关重要。 我很确定这与我经常查询相同地址这一事实有关,但肯定有办法防止它......?
非常感谢!
答案 0 :(得分:1)
有两种超时。客户端超时和服务器超时。在这里,您可以获得服务器超时,这可能是由于来自Web服务器的安全防御机制(IDS / IPS),因为它将模式(在一小段时间内来自单个IP的大量请求)识别为DoS(拒绝服务) )攻击然后你的IP被禁止一段时间。在这种情况下,像在代码中那样增加客户端超时是没有用的。 @Comment:关闭KeepAlive会使应用程序在每个请求上创建与Web服务器的新连接。也许这是您的代码与从浏览器运行javascript之间的巨大差异。将KeepAlive设置为true。
<强> App.Config中强>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "1000" />
</connectionManagement>
</system.net>
</configuration>
答案 1 :(得分:1)
尝试将超时设置为 Timeout.Infinite :
var request = WebRequest.Create(url);
request.Proxy = null;
request.Timeout = Timeout.Infinite;
string text = "";
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var sr = new StreamReader(response.GetResponseStream()))
{
text = sr.ReadToEnd();
}
}