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

标签 c# .net httpwebrequest httpwebresponse

关于如何检查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/

相关文章:

c# - 使用子查询对 Linq 进行 SQL 查询

c# - 如何使用 Roslyn MSBuildWorkspace 查找 C# 项目的 'obj' 目录?

c# - 使用 c# 在 HttpWebRequest 中添加预告片

c# - 如何退出 "braced scope"?

c# - Android 应用程序调试几秒钟然后停止

c# - 关闭断开的异步套接字会使监听器停止监听吗?

c# - 在 foreach 循环中编辑字典值

c# - 组合多个表达式树

wcf - dot.net3.5中带有附件的 SOAP

asp.net - Sharepoint Online 禁止 WebRequest