有很多关于如何检查网址是否有效的帖子。它们都具有基本相同的代码,这似乎适用于所有人 - 虽然不适合我,但我不明白为什么。
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())
为什么不能正常工作?
答案 0 :(得分:2)
检查状态 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支持产品基础结构,不能直接在您的代码中使用。找不到指定的缓存条目。
<强> ConnectFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。无法在传输级别联系远程服务点。
<强> ConnectionClosed 强>
此API支持产品基础结构,不能直接在您的代码中使用。连接过早关闭。
<强> KeepAliveFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。指定Keep-alive标头的请求的连接意外关闭。
<强> MessageLengthLimitExceeded 强>
此API支持产品基础结构,不能直接在您的代码中使用。收到的消息在发送请求或从服务器接收响应时超过了指定的限制。
<强> NameResolutionFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。名称解析程序服务无法解析主机名。
待强> 此API支持产品基础结构,不能直接在您的代码中使用。内部异步请求正在等待。
<强> PipelineFailure 强> 此API支持产品基础结构,不能直接在您的代码中使用。该请求是一个piplined请求,并且在收到响应之前关闭了连接。
<强> ProtocolError 强>
此API支持产品基础结构,不能直接在您的代码中使用。从服务器收到的响应已完成,但表示协议级错误。例如,HTTP协议错误(例如401 Access Denied)将使用此状态。
<强> ProxyNameResolutionFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。名称解析程序服务无法解析代理主机名。
<强> ReceiveFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。未收到远程服务器的完整响应。
<强> RequestCanceled 强> 此API支持产品基础结构,不能直接在您的代码中使用。请求被取消,调用了WebRequest.Abort方法,或者发生了无法分类的错误。这是状态的默认值。
<强> RequestProhibitedByCachePolicy 强>
此API支持产品基础结构,不能直接在您的代码中使用。缓存策略不允许该请求。通常,当请求不可缓存且有效策略禁止将请求发送到服务器时,会发生这种情况。如果请求方法暗示存在请求主体,请求方法需要与服务器直接交互,或者请求包含条件头,则可能会收到此状态。
<强> RequestProhibitedByProxy 强>
此API支持产品基础结构,不能直接在您的代码中使用。代理不允许此请求。
<强> SecureChannelFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。使用SSL建立连接时发生错误。
<强> SendFailure 强> 此API支持产品基础结构,不能直接在您的代码中使用。无法将完整请求发送到远程服务器。
<强> ServerProtocolViolation 强> 此API支持产品基础结构,不能直接在您的代码中使用。服务器响应不是有效的HTTP响应。
<强>成功强> 此API支持产品基础结构,不能直接在您的代码中使用。没有遇到任何错误。
<强>超时强> 此API支持产品基础结构,不能直接在您的代码中使用。在请求的超时期限内未收到任何回复。
<强> TrustFailure 强>
此API支持产品基础结构,不能直接在您的代码中使用。无法验证服务器证书。
<强>不明错误强>
此API支持产品基础结构,不能直接在您的代码中使用。发生了未知类型的例外。
此处有更多详情:https://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus(v=vs.110).aspx
答案 1 :(得分:0)
您也可以使用此选项。
IPHostEntry ipHost = Dns.GetHostEntry(url);