WebRequest 和 Response 的错误处理
Error Handling for WebRequest & Response
我目前 运行 一个方法,它接受一个字符串(一个域名)并检查站点是否可用,并将信息传递到我创建的域对象中。目前,我 运行 遇到一个问题,其中一个站点已关闭,进而导致应用程序崩溃。下面是方法:
private Domain GetStatus(string x)
{
string status = "";
WebRequest req = HttpWebRequest.Create("http://www." + x);
WebResponse res = req.GetResponse();
HttpWebResponse response = (HttpWebResponse)res;
if ((int)response.StatusCode > 226 || response.StatusCode == HttpStatusCode.NotFound)
{
status = "ERROR: " + response.StatusCode.ToString();
}
else
{
status = "LIVE";
}
Domain temp = new Domain(x, status);
return temp;
}
最初的想法是 response.StatusCode == HttpStatusCode.NotFound 会处理这样的错误,但它目前在 WebResponse res = req.GetResponse(); 线上崩溃了。响应如下:
System.Net.WebException: 'The remote name could not be resolved: 'www.DOMAIN.com''
问题是由于您自己的代码引发了异常。
这可能是由于缺少互联网连接或 dns 解析问题(这可能是由远程方引起的)。
因此,如果远程服务器抛出错误,如果您无法访问它,您将得到 HTTP 500 Internal Server Error
;您的代码抛出异常,您需要处理该异常。
要解决此问题,您可以使用 try/catch
块,如下所示:
private Domain GetStatus(string x)
{
string status = "";
try
{
WebRequest req = HttpWebRequest.Create("http://www." + x);
WebResponse res = req.GetResponse();
HttpWebResponse response = (HttpWebResponse)res;
if ((int)response.StatusCode > 226 ||
response.StatusCode == HttpStatusCode.NotFound)
{
status = "ERROR: " + response.StatusCode.ToString();
}
else
{
status = "LIVE";
}
}
catch (Exception e)
{
status = "ERROR: Something bad happend: " + e.ToString();
}
Domain temp = new Domain(x, status);
return temp;
}
顺便说一句,
The remote name could not be resolved
表示无法解析主机。
最可能的原因是您的 Internet 已关闭或域拼写错误或域的路由错误(例如在 Intranet 环境中)。
HttpWebRequest 是关于 HTTP 协议的,它是一种约定的语言。
但是如果另一端的人不存在,那么你怎么能指望他 return 你和你 "Hello" 例如?
所以StatusCode
真的只是关于如果实际的远程站点响应,根据请求资源响应状态是什么,是 Successful(200) 吗?未找到(404)?未授权(401)等等。
异常表示,由于多种原因我无法访问该站点。
StatusCode 表示您请求的资源具有 return 这种响应类型。
但是更实际的检查站点是否存在,是查询静态页面并且没有出现异常,更健康的检查,将查询静态页面,您将始终被视为健康;意思是 return 200 OK 响应。
所以这一切都取决于 LIVE 对您(或使用它的客户)意味着什么。
远程主机是否真的在接收请求,意味着没有异常。
或者它实际上意味着,他能够收到请求并 return 给我一个有效的 StatusCode 响应,我希望他 return (健康)。
我目前 运行 一个方法,它接受一个字符串(一个域名)并检查站点是否可用,并将信息传递到我创建的域对象中。目前,我 运行 遇到一个问题,其中一个站点已关闭,进而导致应用程序崩溃。下面是方法:
private Domain GetStatus(string x)
{
string status = "";
WebRequest req = HttpWebRequest.Create("http://www." + x);
WebResponse res = req.GetResponse();
HttpWebResponse response = (HttpWebResponse)res;
if ((int)response.StatusCode > 226 || response.StatusCode == HttpStatusCode.NotFound)
{
status = "ERROR: " + response.StatusCode.ToString();
}
else
{
status = "LIVE";
}
Domain temp = new Domain(x, status);
return temp;
}
最初的想法是 response.StatusCode == HttpStatusCode.NotFound 会处理这样的错误,但它目前在 WebResponse res = req.GetResponse(); 线上崩溃了。响应如下:
System.Net.WebException: 'The remote name could not be resolved: 'www.DOMAIN.com''
问题是由于您自己的代码引发了异常。
这可能是由于缺少互联网连接或 dns 解析问题(这可能是由远程方引起的)。
因此,如果远程服务器抛出错误,如果您无法访问它,您将得到 HTTP 500 Internal Server Error
;您的代码抛出异常,您需要处理该异常。
要解决此问题,您可以使用 try/catch
块,如下所示:
private Domain GetStatus(string x)
{
string status = "";
try
{
WebRequest req = HttpWebRequest.Create("http://www." + x);
WebResponse res = req.GetResponse();
HttpWebResponse response = (HttpWebResponse)res;
if ((int)response.StatusCode > 226 ||
response.StatusCode == HttpStatusCode.NotFound)
{
status = "ERROR: " + response.StatusCode.ToString();
}
else
{
status = "LIVE";
}
}
catch (Exception e)
{
status = "ERROR: Something bad happend: " + e.ToString();
}
Domain temp = new Domain(x, status);
return temp;
}
顺便说一句,
The remote name could not be resolved
表示无法解析主机。
最可能的原因是您的 Internet 已关闭或域拼写错误或域的路由错误(例如在 Intranet 环境中)。
HttpWebRequest 是关于 HTTP 协议的,它是一种约定的语言。
但是如果另一端的人不存在,那么你怎么能指望他 return 你和你 "Hello" 例如?
所以StatusCode
真的只是关于如果实际的远程站点响应,根据请求资源响应状态是什么,是 Successful(200) 吗?未找到(404)?未授权(401)等等。
异常表示,由于多种原因我无法访问该站点。 StatusCode 表示您请求的资源具有 return 这种响应类型。
但是更实际的检查站点是否存在,是查询静态页面并且没有出现异常,更健康的检查,将查询静态页面,您将始终被视为健康;意思是 return 200 OK 响应。
所以这一切都取决于 LIVE 对您(或使用它的客户)意味着什么。
远程主机是否真的在接收请求,意味着没有异常。 或者它实际上意味着,他能够收到请求并 return 给我一个有效的 StatusCode 响应,我希望他 return (健康)。