检查 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);