【问题标题】:C# HttpWebRequest ignore HTTP 500 errorC# HttpWebRequest 忽略 HTTP 500 错误
【发布时间】:2017-03-10 22:34:15
【问题描述】:

我正在尝试使用 C#4.0 中的 WebRequest 类下载页面。由于某种原因,此页面正确返回所有内容,但带有 HTTP 500 内部错误代码。

Request.EndGetResponse(ar);

当页面返回 HTTP 500 或 404 时,此方法会引发 WebException。我怎么能忽略这个?我知道它返回 500 但我仍然想阅读页面/响应的内容。

【问题讨论】:

    标签: c#-4.0 httpwebrequest


    【解决方案1】:

    您可以通过查看 WebExeption 类公开的响应对象,使用 try / catch 块来捕获异常并在 http 404 或 500 错误的情况下进行额外处理。

    try
    {
        response = (HttpWebResponse)Request.EndGetResponse(ar);
    }
    catch (System.Net.WebException ex)
    {
        response = (HttpWebResponse)ex.Response;
    
        switch (response.StatusCode)
        {
            case HttpStatusCode.NotFound: // 404
                break;
    
            case HttpStatusCode.InternalServerError: // 500
                break;
    
            default:
                throw;
        }
    }
    

    【讨论】:

      【解决方案2】:
      try {
          resp = rs.Request.EndGetResponse(ar);
      } 
      catch (WebException ex) 
      { 
          resp = ex.Response as HttpWebResponse; 
      }
      

      【讨论】:

        【解决方案3】:

        使用try / catch 块让您的程序即使抛出异常也能继续运行:

        try
        {
            Request.EndGetResponse(ar);
        }
        catch (WebException wex)
        {
            // Handle your exception here (or don't, to effectively "ignore" it)
        }
        
        // Program will continue to execute
        

        【讨论】:

          【解决方案4】:

          问题是由于没有将浏览器详细信息发送到请求站点。 您需要向请求数据的网站表明自己的身份。

          简单地将用户代理添加到您的代码中

          request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";

          结束代码应该是这样的:

          HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(http://WEBURL);
          Request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
          try
          {
          response = (HttpWebResponse)Request.EndGetResponse(ar);
          }
          catch (System.Net.WebException ex)
          {
          response = (HttpWebResponse)ex.Response;
          
          switch (response.StatusCode)
          {
              case HttpStatusCode.NotFound: // 404
                  break;
          
              case HttpStatusCode.InternalServerError: // 500
                  break;
          
              default:
                  throw;
          }
          }
          

          请找到上述代码的参考/证明: https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

          链接中提到了这个

          “默认情况下,WebClient 实例不发送可选的 HTTP 标头。如果您的请求需要可选标头,则必须将标头添加到 Headers 集合中。例如,要在响应中保留查询,您必须添加用户-代理标头。此外,如果缺少用户代理标头,服务器可能会返回 500(内部服务器错误)。”

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-11
            • 1970-01-01
            • 2020-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-01
            相关资源
            最近更新 更多