为啥 System.Net.Browser.ClientHttpWebRequest 访问无效服务器地址时返回 404?

Posted

技术标签:

【中文标题】为啥 System.Net.Browser.ClientHttpWebRequest 访问无效服务器地址时返回 404?【英文标题】:Why does System.Net.Browser.ClientHttpWebRequest return 404 when accessing invalid server address?为什么 System.Net.Browser.ClientHttpWebRequest 访问无效服务器地址时返回 404? 【发布时间】:2014-03-13 19:44:32 【问题描述】:

当访问没有服务器运行的无效 IP 地址时,Microsoft System.Net.Browser.ClientHttpWebRequest 似乎抛出了一个状态代码为 NotFound 的 WebException,这对应于服务器的 404 响应。正确的响应不是 HTTP 状态代码,也绝对不在 400 范围内,因为客户端库从来没有机会与有效的 HTTP 服务器对话。这对我的代码来说是有问题的,因为 404 在我的服务器端点返回时具有特殊含义。

有没有办法确定服务器何时实际返回 404 (NotFound) 响应,以及何时被错误地用于描述 System.Net.Browser.ClientHttpWebRequest 类的一般连接故障?

请注意,我在 WP8 上会发生这种行为。

【问题讨论】:

我已经能够在我的一个应用程序中使用HttpClient 处理这种特定情况,方法是检查错误附带的原因短语(如果它是空的,那么它很可能是连接问题)。我不知道是否可以用HttpWebRequest 做同样的事情。 您的互联网服务提供商会这样做。它的 DNS 服务器将您重定向到他们拥有的垃圾页面。在您的网络浏览器中尝试http://1.1.1.1 以查看同一页面。寻找更好的 ISP 或将 DNS 地址更改为 8.8.8.8 【参考方案1】:

我遇到了同样的问题,捕获 System.Net.WebException 并在 catch 语句中插入以下代码行使我能够获得服务器返回的实际响应:

catch(System.Net.WebException we)

   using (var streamResponse = we.Response.GetResponseStream())
   
      using (var streamRead = new StreamReader(streamResponse))
      
         string responseString = streamRead.ReadToEnd();

         // do something with responseString
      
   


【讨论】:

以上是关于为啥 System.Net.Browser.ClientHttpWebRequest 访问无效服务器地址时返回 404?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?