我构建此方法(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);
}
答案 0 :(得分:8)
您未在Dispose
对象上调用HttpWebResponse
,这意味着该连接仍然存在。如果您将代码更改为以下内容:
public static string isAlive(string url)
{
Console.WriteLine("start: Is Alive Test");
WebRequest request = WebRequest.Create(url);
try
{
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
return Convert.ToString((int)response.StatusCode);
}
}
catch(WebException ex)
{
using(HttpWebResponse res = (HttpWebResponse)ex.Response)
{
return Convert.ToString((int)res.StatusCode);
}
}
}
using
语句将隐式为您调用Dispose,这将关闭连接。
你的代码在第二次迭代后暂停的原因是因为.Net有一个内置的最大连接数,它将打开一个网站,默认为2.这由System.Net.ServicePointManager.DefaultConnectionLimit
控制你可以如果你需要增加。
答案 1 :(得分:0)
可能与您没有关闭HttpWebResponse有关。 添加一个finally到那个关闭响应的try catch。 还要关闭catch中的WebException响应。
答案 2 :(得分:0)
使用“使用”它会很好用。
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
return Convert.ToString((int)response.StatusCode);
}
答案 3 :(得分:0)
HttpWebResponse
var包装到using
语句中,因为它是一次性的ex.Response.StatusCode
之前,请确保ex.Status是ProtocolError
样品:
public static async Task<string> GetStatusCode(string url)
{
var request = (HttpWebRequest)WebRequest.Create(url);
try
{
using (var response = (HttpWebResponse)await request.GetResponseAsync())
{
return response.StatusCode.ToString();
}
}
catch (WebException ex)
{
return ex.Status == WebExceptionStatus.ProtocolError ?
((HttpWebResponse)e.Response).StatusCode.ToString() : null;
}
}