检查URL是否存在 - HTTP请求始终返回异常

时间:2016-11-17 10:46:46

标签: c# .net httpwebrequest httpwebresponse

有很多关于如何检查网址是否有效的帖子。它们都具有基本相同的代码,这似乎适用于所有人 - 虽然不适合我,但我不明白为什么。

    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())

为什么不能正常工作?

2 个答案:

答案 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);