2012-04-10 117 views
31

我想使用HttpWebRequest来验证Url的存在。我发现,这样做基本上这几个例子:为什么HttpWebRequest会抛出异常而不是返回HttpStatusCode.NotFound?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

然而,如果该网址是否确实坏了,它不返回响应,它的而不是抛出异常。

我修改我的代码如下:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
    request.Method = "HEAD"; 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     return response.StatusCode; 
    } 
} 
catch (System.Net.WebException ex) 
{ 
    var response = ex.Response as HttpWebResponse; 
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode; 
} 

这似乎终于做我想做的。

但我想知道,为什么请求会抛出一个异常,而不是返回带有NotFound状态码的响应?

回答

54

当网页严重使用状态码,而不是全部都是错误时,这可能会非常烦人。这可以使处理身体相当痛苦。我个人使用这种扩展方法来获得响应。

public static class HttpWebResponseExt 
{ 
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req) 
    { 
     try 
     { 
      return (HttpWebResponse)req.GetResponse(); 
     } 
     catch (WebException we) 
     { 
      var resp = we.Response as HttpWebResponse; 
      if (resp == null) 
       throw; 
      return resp; 
     } 
    } 
} 
+6

虽然这是使用HttpWebRequest/Response从.Net Framework作者的部分上的这个糟糕的设计选择保存代码的最少工作,但正确的解决方案是使用HttpClient,它不会抛出4xx和5xx状态代码。例外情况是针对特殊情况的,抛出只是为了抓住它,并继续进行,就好像这样对于性能来说是丑陋和不好的,尤其是考虑到有一个更好的选项可以完全避免它。 https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx – 2015-06-22 22:58:38

+1

这似乎不是真的;我在一个项目中使用HttpClient,当调用一个不存在的url并返回一个404状态码时,客户端抛出一个异常而不是返回404状态码的响应。使用httpclient来防止这种情况有额外的步骤吗? – SelAromDotNet 2017-04-12 17:17:15

2

为什么不呢?它们都是有效的设计选项,而HttpWebRequest只是设计用于这种方式。

+0

只要你可以读取响应头和身体时的代码是4XX – 2012-04-10 00:59:20

+4

我想我很困惑,因为没有我看到这种情况的代码示例了这方面的考虑。许多人甚至没有尝试/抓住,我想知道是否我错过了一些东西,并且有办法在不抛出异常的情况下获得状态。如果状态码被设计为处理这种状态,那么抛出整个异常似乎是违反直觉的 – SelAromDotNet 2012-04-10 01:07:19

+1

是的,当你认为“当然是xxx测试了他放在他的网站上的代码行时,它总是会导致有趣的结果!”而你却错了:) – 2012-04-10 01:35:04

相关问题