我的应用程序中使用了 HttpWebRequest
, 它在多个线程中检查一些URI, 我遇到了多种类型的超时异常。
- 操作已超时
- 远程服务器返回错误: (504) 网关超时.
它们的细节如下:
System.Net.WebException: 操作已超时 at System.Net.HttpWebRequest.GetResponse() at ......
和
System.Net.WebException: 远程服务器返回错误: (504) 网关超时 at System.Net.HttpWebRequest.GetResponse() at ....
它们的不同之处是什么?
我的函数如下:
public bool CheckUri(Uri m_url)
{
try
{
HttpWebRequest request = HttpWebRequest.Create(m_url) as HttpWebRequest;
request.UserAgent = "MyUserAgent";
//For: The underlying connection was closed: An unexpected error occurred on a receive.
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "HEAD"; //Get only the header information
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
int statusCode = (int)response.StatusCode;
if (statusCode >= 100 && statusCode < 400) //Good requests
{
string sContent = null;
using (var stream = response.GetResponseStream())
using (StreamReader loResponseStream = new StreamReader(stream))
sContent = loResponseStream.ReadToEnd();
return true;
}
else
{
return false;
//hard to reach here
}
}
}
//vexing exception
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
Console.WriteLine(response.StatusCode);
}
}
else
{
Console.WriteLine(ex.Message);
}
return false;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
还有,如果有人能告诉我,如果多个线程使用不同的URI调用此方法是否会出现问题。我没有得到任何跨线程异常。此方法实际上是Windows服务的一部分,该服务监视近200个URI的列表。