我目前正在编写一个简单的应用程序,它会对Web服务器执行一系列请求,但我遇到了一个奇怪的...功能?
我不需要请求的响应流,而只需要状态代码。因此,对于我的每一段数据,我都称自己为“发送”方法:
public static int Send(string uri)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
request = (HttpWebRequest)WebRequest.Create(uri);
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK) return 0;
}
catch (Exception e)
{
if (request != null) request.Abort();
}
return -1;
}
工作正常吗?是的,除非我至少调用此功能两次。连续第二次调用此类函数(使用相同的uri)将始终导致超时。
现在,这很奇怪:如果我在返回零时添加request.Abort();
(这里,当状态代码为200时) - 一切都能正常工作。
所以我的问题是 - 为什么?是某种框架限制,或者特定服务器上的某种反DOS保护(不幸的是,服务器对我来说是一个黑盒子)?或者我可能只是不明白这一切是如何运作的?
答案 0 :(得分:2)
尝试处理Web响应,可能会泄漏一些资源
public static int Send(string uri)
{
HttpWebRequest request = null;
try
{
request = (HttpWebRequest)WebRequest.Create(uri);
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK) return 0;
}
}
catch (Exception e)
{
if (request != null) request.Abort();
}
return -1;
}
还有一个默认的连接数(我认为2个,但您可以配置),您可以同时进入某个域,请参阅this SO question。您可能会使用未公开的回复达到此限制。
答案 1 :(得分:-1)
首先,我要进行一系列更改,以便找到根源:
然后,您应该获得所需的异常信息。
此外,您应该使用“HEAD”作为方法,因为您只需要状态代码:
request.Method = "HEAD";