【问题标题】:c# - httpwebrequest status code returns 200 instead of 404c# - httpwebrequest 状态码返回 200 而不是 404
【发布时间】:2013-07-30 10:38:31
【问题描述】:

我正在尝试这段代码..

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.goo4le.com/");
request.Method = "HEAD";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
  Console.Write((int)response.StatusCode);
}

goo4le 是一个不存在的域。所以它应该返回 404。相反,它返回 200 状态。

我认为这是因为我的宽带提供商使用了自定义 404 页面。

This is what i see 当我在浏览器中输入 goo4le.com 时。

谁能告诉我如何获取真正的 http 状态而不是我的浏览器状态?

【问题讨论】:

  • 我收到异常“无法解析远程名称:'www.goo4le.com'”

标签: c# httpwebrequest http-response-codes


【解决方案1】:

我在运行它时实际上没有得到任何状态码,我得到一个 DNS 错误,说我无法查找域。

我想您对 ISP 的看法是完全正确的,如果您没有收到此错误,他们可能是通过 DNS 重定向来执行此操作的。您可以通过使用您的 ISP 提供的 DNS 服务器以外的 DNS 服务器来解决此问题,尝试 googles 8.8.8.8、8.8.4.4 (https://developers.google.com/speed/public-dns/)

这来自他们的常见问题

Google 公共 DNS 与我的 ISP 的 DNS 服务或其他服务有何不同? 开放 DNS 解析器?如何判断它是否更好?

打开解析器和 您的 ISP 都提供 DNS 解析服务。我们邀请您尝试 Google 公共 DNS 作为您的主要或次要 DNS 解析器以及 任何其他备用 DNS 服务。有很多事情要考虑 在确定适合您的 DNS 解析器时,例如速度, 响应的可靠性、安全性和有效性。与 Google Public 不同 DNS、一些 ISP 和开放解析器阻止、过滤或重定向 DNS 回应。

Google 公共 DNS 如何处理不存在的域?

如果 您对不存在的域名发出查询,Google Public 根据 DNS 协议,DNS 始终返回 NXDOMAIN 记录 标准。浏览器应将此响应显示为 DNS 错误。如果, 相反,您会收到除错误消息以外的任何响应(例如 例如,您被重定向到另一个页面),这可能是结果 以下内容:客户端应用程序,例如浏览器插件 正在显示一个不存在的域的备用页面。一些 ISP 可以拦截所有 NXDOMAIN 响应并将其替换为 导致他们自己的服务器。如果您担心您的 ISP 拦截 Google 公共 DNS 请求或响应,您应该 请联系您的 ISP。

【讨论】:

    【解决方案2】:

    您可以尝试禁用重定向,不幸的是我无法测试它,因为我有另一个提供商(如果这是问题的话)。

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.goo4le.com/");
    request.Method = "HEAD";
    request.AllowAutoRedirect = false;
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
      Console.Write((int)response.StatusCode);
    }
    

    如果它正在工作,它很可能会抛出一个异常,因为所有返回不是 200 的状态码的东西都会抛出一个...... 如果你想抓住它,试试这个:

    try
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.goo4le.com/");
        request.Method = "HEAD";
        request.AllowAutoRedirect = false;
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
      Console.Write((int)response.StatusCode);
    }
    
    }
    catch (WebException e)
    {
       // in this case it was a status code exception (not status 200...)
       if (e.Response != null) Console.Write((int)e.Response.StatusCode);
       else throw;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 2017-10-26
      • 1970-01-01
      • 2019-03-23
      • 2021-04-04
      • 2018-05-28
      相关资源
      最近更新 更多