为什么HttpWebRequest抛出异常而不是返回HttpStatusCode.NotFound?

Sel*_*Net 37 c# asp.net httpwebrequest http-status-code-404

我正在尝试使用HttpWebRequest来验证Url的存在.我找到了几个基本上做的例子:

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

但是,如果url确实被破坏了,它不会返回响应,而是抛出异常.

我修改了我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

这似乎终于做了我想要的.

但我想知道,为什么请求抛出异常而不是使用NotFound状态代码返回响应?

Wil*_*ill 62

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是使用HttpWebRequest/Response从.Net Framework作者的这个糟糕设计选择保存代码的最少工作,但正确的解决方案是使用HttpClient,它不会抛出4xx和5xx状态代码.异常是针对特殊情况,并且仅仅是为了抓住它并继续进行,好像这样很难看并且对性能有害,特别是考虑到有一个更好的选择可以完全避免它.https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx (6认同)
  • 这似乎不是真的; 我在项目中使用HttpClient,当调用不存在的返回404状态代码的url时,客户端抛出异常而不是返回带有404状态代码的响应.是否有一个额外的步骤使用httpclient来防止这种情况? (3认同)