关于如何检查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”和“ http://www.google.com”等参数测试了该方法。无论我插入现有的URL还是不存在的URL,都在此行得到WebException:
using (var response = (HttpWebResponse)request.GetResponse())
为什么它不起作用?
最佳答案
检查状态WebException.Status
这将使您知道发生了哪些特定的Web异常。
更新:尝试更改request.Method = "HEAD";
获取并尝试。
尝试使用不可用的(404)网址,比较状态。检查是否有任何东西阻止了您的请求。
这就是我在代码中进行管理的方式,仅使用ftp特定状态进行处理。“ CommStatus”是带有错误代码的ENUM,可在整个应用程序中使用。
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支持产品基础结构,不能直接在您的代码中使用。在传输级别无法联系远程服务点。
连接已关闭
此API支持产品基础结构,不能直接在您的代码中使用。连接过早关闭。
保持活动失败
此API支持产品基础结构,不能直接在您的代码中使用。指定Keep-alive标头的请求的连接意外关闭。
MessageLengthLimitExceeded
此API支持产品基础结构,不能直接在您的代码中使用。发送请求或从服务器接收响应时,收到超出指定限制的消息。
名称解析失败
此API支持产品基础结构,不能直接在您的代码中使用。名称解析器服务无法解析主机名。
待定
此API支持产品基础结构,不能直接在您的代码中使用。内部异步请求正在等待处理。
管道故障
此API支持产品基础结构,不能直接在您的代码中使用。该请求是一个标准请求,在收到响应之前已关闭连接。
协议错误
此API支持产品基础结构,不能直接在您的代码中使用。从服务器收到的响应已完成,但指示协议级别的错误。例如,HTTP协议错误(例如401 Access Denied)将使用此状态。
ProxyNameResolutionFailure
此API支持产品基础结构,不能直接在您的代码中使用。名称解析器服务无法解析代理主机名。
接收失败
此API支持产品基础结构,不能直接在您的代码中使用。没有从远程服务器收到完整的响应。
要求取消
此API支持产品基础结构,不能直接在您的代码中使用。请求被取消,调用了WebRequest.Abort方法,或者发生了无法分类的错误。这是“状态”的默认值。
RequestProhibitedByCachePolicy
此API支持产品基础结构,不能直接在您的代码中使用。缓存策略不允许该请求。通常,当请求不可缓存并且有效策略禁止将请求发送到服务器时,会发生这种情况。如果请求方法暗示存在请求主体,请求方法需要与服务器直接交互或请求包含条件标头,则您可能会收到此状态。
RequestProhibitedByProxy
此API支持产品基础结构,不能直接在您的代码中使用。代理不允许此请求。
安全通道失败
此API支持产品基础结构,不能直接在您的代码中使用。使用SSL建立连接时发生错误。
发送失败
此API支持产品基础结构,不能直接在您的代码中使用。无法将完整的请求发送到远程服务器。
ServerProtocolViolation
此API支持产品基础结构,不能直接在您的代码中使用。服务器响应不是有效的HTTP响应。
成功
此API支持产品基础结构,不能直接在您的代码中使用。没有遇到错误。
超时
此API支持产品基础结构,不能直接在您的代码中使用。在请求的超时期间未收到任何响应。
信任失败
此API支持产品基础结构,不能直接在您的代码中使用。无法验证服务器证书。
未知错误
此API支持产品基础结构,不能直接在您的代码中使用。发生未知类型的异常。
此处有更多详细信息:https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx
关于c# - 检查URL是否存在-HTTP请求始终返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652813/