InternalServerError时 HttpWebRequest 的 GetResponse 方法处理策略

转帖|其它|编辑:郝浩|2008-08-05 14:32:43.000|阅读 1389 次

概述:InternalServerError时 HttpWebRequest 的 GetResponse 方法处理策略

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  现象

  我们编码实现请求一个页面时,请求的代码类似如下代码:

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl);
  req.UserAgent = "MSIE6.0";
  req.Method = "GET";
  HttpWebResponse res = (HttpWebResponse)req.GetResponse();
  StreamReader sr = new StreamReader(res.GetResponseStream(), strEncode);
  strHtml = sr.ReadToEnd();
  sr.Close();
  res.Close();

  但是,如果我们请求的这个页面正好是一个有异常发生的页面,或者不存在的页面。我们上面的代码就会在

  req.GetResponse();这里抛出异常:远程服务器返回错误: (500) 内部服务器错误。 我们通过上面的代码,是不能得到错误发生时候的页面源代码的。 

  分析原因:

  (HttpWebResponse)req.GetResponse(); 这行代码中做了如下一件事情:

  当服务器段ASP.net程序有 Exception 发生时,客户端应用程序接受了HTTP 协议错误后。把这个HTTP 协议错误转换成 Status 设置为 WebExceptionStatus.ProtocolError 的 WebException,并且把这个异常throw出来。

  解决问题

  那如果我们想获得错误发生时候服务器段错误页面的源代码该如何做呢?

  其实非常非常简单的做法,我们用下面的代码就不论错误发生与否,都可以获得服务器段页面的源代码。

   HttpWebResponse res;
  try {
     res = (HttpWebResponse)req.GetResponse();
  } catch (WebException ex) {
      res = (HttpWebResponse)ex.Response;
  }
  StreamReader sr = new StreamReader(res.GetResponseStream(), strEncode);
  strHtml = sr.ReadToEnd();

  当异常发生事后,WebException 中不仅有 StatusCode 标志着 HTTP 的错误代码,而且它的 Response 属性还包含由服务器发送的 WebResponse,来指示遇到的实际 HTTP 错误。

  这个问题的解决方法是这么的简单,但是我碰到这个问题后,通过Google、baidu搜索,竟然很多人不知道。所以整理这篇博客,帮助被这个问题困挠的人。

附,HttpWebRequest 的派生关系:

System.Object
   System.MarshalByRefObject
    System.Net.WebRequest
       System.IO.Packaging.PackWebRequest
       System.Net.FileWebRequest
       System.Net.FtpWebRequest
       System.Net.HttpWebRequest


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:个人博客

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP