【发布时间】:2023-10-12 20:09:01
【问题描述】:
我构建此方法 (c#) 是为了从 URL 接收 HTTP 响应状态代码。 当我运行这个方法时,它工作正常,但是当我在循环中运行它时,第三次它卡住了。有什么线索吗??
public static string isAlive(string url)
{
Console.WriteLine("start: Is Alive Test");
WebRequest request = WebRequest.Create(url);
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return Convert.ToString((int)response.StatusCode);
}
catch(WebException ex)
{
HttpWebResponse res = (HttpWebResponse)ex.Response;
return Convert.ToString((int)res.StatusCode);
}
}
循环
for (int i = 0; i < 5; i++)
{
string a = isAlive("https://www.yahoo.com/");
Console.WriteLine(a);
}
【问题讨论】:
-
你确定它卡住了,而不是在等待响应?服务器很有可能会限制请求,因为它可能会检测到可疑活动(在如此短的时间内向服务器抛出如此多的请求似乎是 DoS 攻击)。鉴于您想在不阻塞 UI 线程的情况下发出大量请求,您可能需要考虑转而使用
BeginX/EndX调用。 -
定义“卡住”。如果您的程序在 3 次尝试后挂起,则可能是 yahoo 服务器拒绝了您快速连续的
https请求。另一种选择是您的操作系统正在阻止快速连接到同一地址(内部洪水保护)。编辑 - 答案是另一种选择,您一次打开的连接太多。 -
您需要将 .GetResponse() 包装到
using语句中,并出于性能考虑使您的 isAlive 方法异步。请参阅下面的代码示例。 -
@James,我从来没有说过将
GetResponse包装成using会使其异步。你从哪里得到的?
标签: c# .net webrequest httpwebresponse getresponse