sdasdasdsadsa

来源:互联网 发布:天猫东西好还是淘宝好 编辑:程序博客网 时间:2024/05/29 05:10
 

 http://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.getresponse(v=VS.80).aspx

http://archive.cnblogs.com/a/2176475/

最近公司拓展市场异常迅猛,数周之类开出去几十套系统,虽然系统名字不一样,但各个内容相似。由于时间紧迫,很多开出去的系统

出现各种神奇的错误,当初虽然有记录错误日志,然而很多客户使用的是自己的服务器和数据库,出了问题我们并不能立即掌握信息,

因此决定做一个捕获所有系统的异常并保存到自家数据库中。

实现思路

在每个系统出写入报告错误代码(找个合理的理由,比如系统免费升级) -> 自家服务器接收并处理错误报告 -> 反馈用户(解决掉BUG就行,不要太声扬) 

基础回顾

---参考msdn

1.HttpWebRequest类:提供WebRequest类的Http特定的实现。

HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
不要使用构造函数创建HttpWebRequest实例,请使用System.Net.WebRequest.Create(URI uriString)来创建实例,如果URI是Http://或Https://,
返回的是HttpWebRequest对象。(建立请求特定URI的对象)

当向资源发送数据时,GetRequestStream方法返回用于发送数据的Stream对象。(获取请求数据的流对象)

GetResponse方法向RequestUri属性指定的资源发出同步请求并返回包含该响应的HttpWebResponse(获取来自internet的响应)

实例讲解

1.远程请求并返回响应

View Code
 1  /// <summary> 2     /// 报告系统错误 3     /// </summary> 4     /// <param name="ex"></param> 5     /// <returns></returns> 6     public static string Sys_ReportError(Exception ex) 7     { 8         try 9         {10             //要提交表单的URI字符串11             string uriString = "http://localhost/Sys_ReportError.aspx";12             HttpContext context = HttpContext.Current;13             if (context == null) return string.Empty;14             string targetSite = ex.TargetSite.ToString();15             string stackTrace = ex.StackTrace;16             string friendlyMsg = ex.Message;17             string errorPage = context == null || context.Request == null ? "" : context.Request.Url.ToString();18             string projectName = Config.Sys_Title();19 20             //要提交的字符串数据21             string postString = "targetSite=" + HttpUtility.UrlEncode(targetSite);22             postString += "&stackTrace=" + HttpUtility.UrlEncode(stackTrace);23             postString += "&friendlyMsg=" + HttpUtility.UrlEncode(friendlyMsg);24             postString += "&errorPage=" + HttpUtility.UrlEncode(errorPage);25             postString += "&projectName=" + HttpUtility.UrlEncode(projectName);26             postString += "&key=" + "";27 28 29             HttpWebRequest webRequest = null;30             StreamWriter requestWriter = null;31             string responseData = "";32 33             webRequest = System.Net.WebRequest.Create(uriString) as HttpWebRequest;34             webRequest.Method = "POST";35             webRequest.ServicePoint.Expect100Continue = false;36             webRequest.Timeout = 1000 * 60;37 38             webRequest.ContentType = "application/x-www-form-urlencoded";39 40             //POST the data.41             requestWriter = new StreamWriter(webRequest.GetRequestStream());42             try43             {44                 requestWriter.Write(postString);45             }46             catch (Exception ex2)47             {48                 return "连接错误";49             }50             finally51             {52                 requestWriter.Close();53                 requestWriter = null;54             }55 56             responseData = WebResponseGet(webRequest);57 58             webRequest = null;59 60             return responseData;61         }62         catch63         {64             return "未知错误";65         }                      66     }


View Code
 1 /// <summary> 2     /// Process the web response. 3     /// </summary> 4     /// <param name="webRequest">The request object.</param> 5     /// <returns>The response data.</returns> 6     public static string WebResponseGet(HttpWebRequest webRequest) 7     { 8         StreamReader responseReader = null; 9         string responseData = "";10 11         try12         {13             responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());14             responseData = responseReader.ReadToEnd();15         }16         catch17         {18             return "连接错误";19         }20         finally21         {22             webRequest.GetResponse().GetResponseStream().Close();23             responseReader.Close();24             responseReader = null;25         }26 27         return responseData;28     }

2.远程服务器读取流

View Code
1 _context = HttpContext.Current;2 Stream stream = _context.Request.InputStream; //获取当前传入Http输入流3 long length = stream.Length;4 byte[] data = _context.Request.BinaryRead((int)length);//对当前输入流进行指定字节数的二进制读取5 string strContent = Encoding.UTF8.GetString(data);//解码为UTF8编码形式的字符串

代码讲解到此结束,一些相关补充

1.HttpWebRequest对象有一些相关设置属性,如Method(发送方式),TimeOut(请求超时时间),ContentType(Http标头的值)等等。

2.若远程接收页面出错,该如何调试,很简单,只需写入下面的代码:

View Code
 1         HttpWebResponse res = null; 2         WebResponse response = null; 3         try 4         { 5         WebResponse response = webRequest.GetResponse(); 6         } 7         catch (WebException ex1) 8         { 9             res = (HttpWebResponse)ex1.Response;10         }11         finally12         {13             StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);14             string strhtml = sr.ReadToEnd();15             HttpContext.Current.Response.Write(strhtml);16         }

当获取服务器响应出错时,捕捉错误,最终打印出错误即可。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//////////////////////////////////////////////////============================================================================================

 

C#用HttpWebRequest通过代理服务器验证后抓取网页内容
2010-05-24 20:10

string urlStr = "http://www.domain.com";                            //設定要獲取的地址
HttpWebRequest hwr = (HttpWebRequest)HttpWebRequest.Create(urlStr);    //建立HttpWebRequest對象
hwr.Timeout = 60000;                                                //定義服務器超時時間
WebProxy proxy = new WebProxy();                                    //定義一個網關對象
proxy.Address = new Uri("http://proxy.domain.com:3128");            //網關服務器:端口
proxy.Credentials = new NetworkCredential("f3210316", "6978233");    //用戶名,密碼
hwr.UseDefaultCredentials = true;                                    //啟用網關認証
hwr.Proxy = proxy;                                                    //設置網關
HttpWebResponse hwrs = (HttpWebResponse)hwr.GetResponse();            //取得回應
Stream s = hwrs.GetResponseStream();                                //得到回應的流對象
StreamReader sr = new StreamReader(s, Encoding.UTF8);                //以UTF-8編碼讀取流
StringBuilder content = new StringBuilder();                        //
while (sr.Peek() != -1)                                                //每次讀取一行,直到
{                                                                    //下一個字節沒有內容
    content.Append(sr.ReadLine()+"\r\n");                            //返回為止
}                                                                    //
return content.ToString() ;                                            //返回得到的字符串


//创建一个HTTP请求
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://某家网站的验证码服务器/getimage?0.4283556984309326");
//设置一个代理
WebProxy myproxy = new WebProxy("202.101.6.85",8080);
req.Proxy = myproxy;
//获取代理服务器的回应
HttpWebResponse res = null;
try
{
res = (HttpWebResponse)req.GetResponse();
}
catch
{
MessageBox.Show("无法连接代理!");
return;
}
//判断HTTP响应状态
if(res.StatusCode != HttpStatusCode.OK)
{
MessageBox.Show("访问失败!");
res.Close();
return;
}
//获取应答流
System.IO.Stream stream = res.GetResponseStream();
//直接加载到图片(可以直接显示到图片控件)
System.Drawing.Bitmap bp = new Bitmap(stream);
//关闭应答流和服务器的应答
stream.Close();
res.Close();
//输出所有的Header(当然包括服务器输出的Cookie)
for(int ii=0;ii<res.Headers.Count;ii++)
{
MessageBox.Show(res.Headers.GetKey(ii)+":"+res.Headers[ii]);
}