c# - httpwebrequest状态代码返回200而不是404

时间:2013-07-30 10:38:31

标签: c# httpwebrequest http-response-codes

我正在尝试此代码..

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页面。

当我在浏览器中输入goo4le.com时,

This is what i see

有人可以告诉我如何获取真实的http状态而不是我的浏览器状态吗?

2 个答案:

答案 0 :(得分:1)

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

我想你对ISP完全正确,他们可能会通过DNS重定向这样做,因为你没有得到这个错误。您可以使用除ISP之外的DNS服务器来解决此问题,请尝试使用googles 8.8.8.8,8.8.4.4(https://developers.google.com/speed/public-dns/

来自他们的常见问题解答

  

Google Public DNS与我的ISP的DNS服务或其他服务有何不同   打开DNS解析器?我怎么知道它是否更好?

     

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

     

Google Public DNS如何处理不存在的域名?

     

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

答案 1 :(得分:0)

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

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;
}