检查 URL 是否存在 - HTTP 请求总是 returns 异常
Checking if URL exists - HTTP Request always returns an exception
关于如何检查 URL 是否有效的帖子很多。所有这些都具有基本相同的代码,这似乎对每个人都适用——但对我不适用,我不明白为什么。
public static bool ifURLexists(string url)
{
try
{
var request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
//response ALWAYS throws an exception
using (var response = (HttpWebResponse)request.GetResponse())
{
return response.StatusCode == HttpStatusCode.OK;
}
}
catch
{
return false;
}
}
我用“http://www.nonexistingwebsiteblabla.com" and "http://www.google.com”等参数测试了该方法。无论我插入现有的还是不存在的 URL,我都会在这一行收到 WebException:
using (var response = (HttpWebResponse)request.GetResponse())
为什么不能用?
检查状态 WebException.Status
这会让您知道发生了什么特定的 Web 异常。
更新:尝试更改 request.Method = "HEAD";
GET 并尝试。
尝试使用不可用 (404) url,比较状态。 检查是否有任何东西阻止了您的请求。
这就是我在代码中的管理方式,我仅使用 ftp 特定状态进行处理。'CommStatus' 是一个带有错误代码的枚举,可在整个应用程序中使用。
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
switch(response.StatusCode)
{
case FtpStatusCode.ActionNotTakenFileUnavailable:
return CommStatus.PathNotFound;
case FtpStatusCode.NotLoggedIn:
return CommStatus.AuthenticationError;
default: return CommStatus.UnhandledException;
}
}
以下是 WebException 的可用状态。
CacheEntryNotFound
此 API 支持产品基础架构,不应直接在您的代码中使用。找不到指定的缓存条目。
连接失败
此 API 支持产品基础架构,不应直接在您的代码中使用。无法在传输级别联系远程服务点。
ConnectionClosed
此 API 支持产品基础架构,不应直接在您的代码中使用。连接过早关闭。
KeepAlive失败
此 API 支持产品基础架构,不应直接在您的代码中使用。指定 Keep-alive header 的请求的连接意外关闭。
MessageLengthLimitExceeded
此 API 支持产品基础架构,不应直接在您的代码中使用。发送请求或从服务器接收响应时收到超过指定限制的消息。
NameResolutionFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。名称解析器服务无法解析主机名。
待定
此 API 支持产品基础架构,不应直接在您的代码中使用。内部异步请求待处理。
管道故障
此 API 支持产品基础架构,不应直接在您的代码中使用。该请求是一个流水线请求,在收到响应之前连接已关闭。
协议错误
此 API 支持产品基础架构,不应直接在您的代码中使用。从服务器收到的响应是完整的,但指示 protocol-level 错误。例如,诸如 401 拒绝访问之类的 HTTP 协议错误将使用此状态。
ProxyNameResolutionFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。名称解析器服务无法解析代理主机名。
接收失败
此 API 支持产品基础架构,不应直接在您的代码中使用。没有从远程服务器收到完整的响应。
请求已取消
此 API 支持产品基础架构,不应直接在您的代码中使用。请求被取消,调用了 WebRequest.Abort 方法,或者发生了无法分类的错误。这是状态的默认值。
RequestProhibitedByCachePolicy
此 API 支持产品基础架构,不应直接在您的代码中使用。缓存策略不允许该请求。通常,当请求不可缓存并且有效策略禁止将请求发送到服务器时,就会发生这种情况。如果请求方法暗示存在请求 body、请求方法需要与服务器直接交互或请求包含条件 header.
,您可能会收到此状态
RequestProhibitedByProxy
此 API 支持产品基础架构,不应直接在您的代码中使用。代理不允许此请求。
SecureChannelFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。使用 SSL 建立连接时出错。
发送失败
此 API 支持产品基础架构,不应直接在您的代码中使用。无法将完整的请求发送到远程服务器。
ServerProtocolViolation
此 API 支持产品基础架构,不应直接在您的代码中使用。服务器响应不是有效的 HTTP 响应。
成功
此 API 支持产品基础架构,不应直接在您的代码中使用。没有遇到错误。
超时
氏API 支持产品基础架构,不能直接在您的代码中使用。在请求的 time-out 期间未收到任何响应。
信任失败
此 API 支持产品基础架构,不应直接在您的代码中使用。无法验证服务器证书。
未知错误
此 API 支持产品基础架构,不应直接在您的代码中使用。发生了未知类型的异常。
此处有更多详细信息:https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx
你也可以使用这个选项。
IPHostEntry ipHost = Dns.GetHostEntry(url);
关于如何检查 URL 是否有效的帖子很多。所有这些都具有基本相同的代码,这似乎对每个人都适用——但对我不适用,我不明白为什么。
public static bool ifURLexists(string url)
{
try
{
var request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
//response ALWAYS throws an exception
using (var response = (HttpWebResponse)request.GetResponse())
{
return response.StatusCode == HttpStatusCode.OK;
}
}
catch
{
return false;
}
}
我用“http://www.nonexistingwebsiteblabla.com" and "http://www.google.com”等参数测试了该方法。无论我插入现有的还是不存在的 URL,我都会在这一行收到 WebException:
using (var response = (HttpWebResponse)request.GetResponse())
为什么不能用?
检查状态 WebException.Status
这会让您知道发生了什么特定的 Web 异常。
更新:尝试更改 request.Method = "HEAD";
GET 并尝试。
尝试使用不可用 (404) url,比较状态。 检查是否有任何东西阻止了您的请求。
这就是我在代码中的管理方式,我仅使用 ftp 特定状态进行处理。'CommStatus' 是一个带有错误代码的枚举,可在整个应用程序中使用。
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
switch(response.StatusCode)
{
case FtpStatusCode.ActionNotTakenFileUnavailable:
return CommStatus.PathNotFound;
case FtpStatusCode.NotLoggedIn:
return CommStatus.AuthenticationError;
default: return CommStatus.UnhandledException;
}
}
以下是 WebException 的可用状态。
CacheEntryNotFound
此 API 支持产品基础架构,不应直接在您的代码中使用。找不到指定的缓存条目。
连接失败
此 API 支持产品基础架构,不应直接在您的代码中使用。无法在传输级别联系远程服务点。
ConnectionClosed
此 API 支持产品基础架构,不应直接在您的代码中使用。连接过早关闭。
KeepAlive失败
此 API 支持产品基础架构,不应直接在您的代码中使用。指定 Keep-alive header 的请求的连接意外关闭。
MessageLengthLimitExceeded
此 API 支持产品基础架构,不应直接在您的代码中使用。发送请求或从服务器接收响应时收到超过指定限制的消息。
NameResolutionFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。名称解析器服务无法解析主机名。
待定 此 API 支持产品基础架构,不应直接在您的代码中使用。内部异步请求待处理。
管道故障 此 API 支持产品基础架构,不应直接在您的代码中使用。该请求是一个流水线请求,在收到响应之前连接已关闭。
协议错误
此 API 支持产品基础架构,不应直接在您的代码中使用。从服务器收到的响应是完整的,但指示 protocol-level 错误。例如,诸如 401 拒绝访问之类的 HTTP 协议错误将使用此状态。
ProxyNameResolutionFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。名称解析器服务无法解析代理主机名。
接收失败
此 API 支持产品基础架构,不应直接在您的代码中使用。没有从远程服务器收到完整的响应。
请求已取消 此 API 支持产品基础架构,不应直接在您的代码中使用。请求被取消,调用了 WebRequest.Abort 方法,或者发生了无法分类的错误。这是状态的默认值。
RequestProhibitedByCachePolicy
此 API 支持产品基础架构,不应直接在您的代码中使用。缓存策略不允许该请求。通常,当请求不可缓存并且有效策略禁止将请求发送到服务器时,就会发生这种情况。如果请求方法暗示存在请求 body、请求方法需要与服务器直接交互或请求包含条件 header.
RequestProhibitedByProxy
此 API 支持产品基础架构,不应直接在您的代码中使用。代理不允许此请求。
SecureChannelFailure
此 API 支持产品基础架构,不应直接在您的代码中使用。使用 SSL 建立连接时出错。
发送失败 此 API 支持产品基础架构,不应直接在您的代码中使用。无法将完整的请求发送到远程服务器。
ServerProtocolViolation 此 API 支持产品基础架构,不应直接在您的代码中使用。服务器响应不是有效的 HTTP 响应。
成功 此 API 支持产品基础架构,不应直接在您的代码中使用。没有遇到错误。
超时 氏API 支持产品基础架构,不能直接在您的代码中使用。在请求的 time-out 期间未收到任何响应。
信任失败
此 API 支持产品基础架构,不应直接在您的代码中使用。无法验证服务器证书。
未知错误
此 API 支持产品基础架构,不应直接在您的代码中使用。发生了未知类型的异常。
此处有更多详细信息:https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx
你也可以使用这个选项。
IPHostEntry ipHost = Dns.GetHostEntry(url);