推荐一个很好用的HTTP操作类

  1 /// <summary>
  2 /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理
  3 /// 重要提示:请不要自行修改本类,如果因为你自己修改后将无法升级到新版本。如果确实有什么问题请到官方网站提建议,
  4 /// 我们一定会及时修改
  5 /// 编码日期:2011-09-20
  6 /// 编 码 人:苏飞
  7 /// 联系方式:361983679  
  8 /// 官方网址:http://www.sufeinet.com/thread-3-1-1.html
  9 /// 修改日期:2013-04-14
 10 /// </summary>
 11 using System;
 12 using System.Collections.Generic;
 13 using System.Text;
 14 using System.Net;
 15 using System.IO;
 16 using System.Text.RegularExpressions;
 17 using System.IO.Compression;
 18 using System.Security.Cryptography.X509Certificates;
 19 using System.Net.Security;
 20 
 21 namespace Common.PageHelper
 22 {
 23     /// <summary>
 24     /// Http连接操作帮助类 
 25     /// </summary>
 26     public class HttpHelper
 27     {
 28         #region 预定义方法或者变更
 29         //默认的编码
 30         private Encoding encoding = Encoding.Default;
 31         //HttpWebRequest对象用来发起请求
 32         private HttpWebRequest request = null;
 33         //获取影响流的数据对象
 34         private HttpWebResponse response = null;
 35         /// <summary>
 36         /// 根据相传入的数据,得到相应页面数据
 37         /// </summary>
 38         /// <param name="objhttpitem">参数类对象</param>
 39         /// <returns>返回HttpResult类型</returns>
 40         private HttpResult GetHttpRequestData(HttpItem objhttpitem)
 41         {
 42             //返回参数
 43             HttpResult result = new HttpResult();
 44             try
 45             {
 46                 #region 得到请求的response
 47                 using (response = (HttpWebResponse)request.GetResponse())
 48                 {
 49                     result.StatusCode = response.StatusCode;
 50                     result.StatusDescription = response.StatusDescription;
 51                     result.Header = response.Headers;
 52                     if (response.Cookies != null)
 53                         result.CookieCollection = response.Cookies;
 54                     if (response.Headers["set-cookie"] != null)
 55                         result.Cookie = response.Headers["set-cookie"];
 56                     MemoryStream _stream = new MemoryStream();
 57                     //GZIIP处理
 58                     if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
 59                     {
 60                         //开始读取流并设置编码方式
 61                         //new GZipStream(response.GetResponseStream(), CompressionMode.Decompress).CopyTo(_stream, 10240);
 62                         //.net4.0以下写法
 63                         _stream = GetMemoryStream(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
 64                     }
 65                     else
 66                     {
 67                         //开始读取流并设置编码方式
 68                         //response.GetResponseStream().CopyTo(_stream, 10240);
 69                         //.net4.0以下写法
 70                         _stream = GetMemoryStream(response.GetResponseStream());
 71                     }
 72                     //获取Byte
 73                     byte[] RawResponse = _stream.ToArray();
 74                     _stream.Close();
 75                     //是否返回Byte类型数据
 76                     if (objhttpitem.ResultType == ResultType.Byte)
 77                         result.ResultByte = RawResponse;
 78                     //从这里开始我们要无视编码了
 79                     if (encoding == null)
 80                     {
 81                         Match meta = Regex.Match(Encoding.Default.GetString(RawResponse), "<meta([^<]*)charset=([^<]*)[\"']", RegexOptions.IgnoreCase);
 82                         string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value.ToLower() : string.Empty;
 83                         charter = charter.Replace("\"", "").Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk");
 84                         if (charter.Length > 2)
 85                             encoding = Encoding.GetEncoding(charter);
 86                         else
 87                         {
 88                             if (string.IsNullOrEmpty(response.CharacterSet))
 89                                 encoding = Encoding.UTF8;
 90                             else
 91                                 encoding = Encoding.GetEncoding(response.CharacterSet);
 92                         }
 93                     }
 94                     //得到返回的HTML
 95                     result.Html = encoding.GetString(RawResponse);
 96                 }
 97                 #endregion
 98             }
 99             catch (WebException ex)
100             {
101                 //这里是在发生异常时返回的错误信息
102                 response = (HttpWebResponse)ex.Response;
103                 result.Html = ex.Message;
104                 result.StatusCode = response.StatusCode;
105                 result.StatusDescription = response.StatusDescription;
106             }
107             catch (Exception ex)
108             {
109                 result.Html = ex.Message;
110             }
111             if (objhttpitem.IsToLower)
112                 result.Html = result.Html.ToLower();
113 
114             return result;
115         }
116         /// <summary>
117         /// 4.0以下.net版本取数据使用
118         /// </summary>
119         /// <param name="streamResponse"></param>
120         private static MemoryStream GetMemoryStream(Stream streamResponse)
121         {
122             MemoryStream _stream = new MemoryStream();
123             int Length = 256;
124             Byte[] buffer = new Byte[Length];
125             int bytesRead = streamResponse.Read(buffer, 0, Length);
126             // write the required bytes  
127             while (bytesRead > 0)
128             {
129                 _stream.Write(buffer, 0, bytesRead);
130                 bytesRead = streamResponse.Read(buffer, 0, Length);
131             }
132             return _stream;
133         }
134         /// <summary>
135         /// 为请求准备参数
136         /// </summary>
137         ///<param name="objhttpItem">参数列表</param>
138         /// <param name="_Encoding">读取数据时的编码方式</param>
139         private void SetRequest(HttpItem objhttpItem)
140         {
141             // 验证证书
142             SetCer(objhttpItem);
143             //设置Header参数
144             if (objhttpItem.Header != null && objhttpItem.Header.Count > 0)
145             {
146                 foreach (string item in objhttpItem.Header.AllKeys)
147                 {
148                     request.Headers.Add(item, objhttpItem.Header[item]);
149                 }
150             }
151             // 设置代理
152             SetProxy(objhttpItem);
153             //请求方式Get或者Post
154             request.Method = objhttpItem.Method;
155             request.Timeout = objhttpItem.Timeout;
156             request.ReadWriteTimeout = objhttpItem.ReadWriteTimeout;
157             //Accept
158             request.Accept = objhttpItem.Accept;
159             //ContentType返回类型
160             request.ContentType = objhttpItem.ContentType;
161             //UserAgent客户端的访问类型,包括浏览器版本和操作系统信息
162             request.UserAgent = objhttpItem.UserAgent;
163             // 编码
164             encoding = objhttpItem.Encoding;
165             //设置Cookie
166             SetCookie(objhttpItem);
167             //来源地址
168             request.Referer = objhttpItem.Referer;
169             //是否执行跳转功能
170             request.AllowAutoRedirect = objhttpItem.Allowautoredirect;
171             //设置Post数据
172             SetPostData(objhttpItem);
173             //设置最大连接
174             if (objhttpItem.Connectionlimit > 0)
175                 request.ServicePoint.ConnectionLimit = objhttpItem.Connectionlimit;
176         }
177         /// <summary>
178         /// 设置证书
179         /// </summary>
180         /// <param name="objhttpItem"></param>
181         private void SetCer(HttpItem objhttpItem)
182         {
183             if (!string.IsNullOrEmpty(objhttpItem.CerPath))
184             {
185                 //这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
186                 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
187                 //初始化对像,并设置请求的URL地址
188                 request = (HttpWebRequest)WebRequest.Create(objhttpItem.URL);
189                 //将证书添加到请求里
190                 request.ClientCertificates.Add(new X509Certificate(objhttpItem.CerPath));
191             }
192             else
193                 //初始化对像,并设置请求的URL地址
194                 request = (HttpWebRequest)WebRequest.Create(objhttpItem.URL);
195         }
196         /// <summary>
197         /// 设置Cookie
198         /// </summary>
199         /// <param name="objhttpItem">Http参数</param>
200         private void SetCookie(HttpItem objhttpItem)
201         {
202             if (!string.IsNullOrEmpty(objhttpItem.Cookie))
203                 //Cookie
204                 request.Headers[HttpRequestHeader.Cookie] = objhttpItem.Cookie;
205             //设置Cookie
206             if (objhttpItem.CookieCollection != null)
207             {
208                 request.CookieContainer = new CookieContainer();
209                 request.CookieContainer.Add(objhttpItem.CookieCollection);
210             }
211         }
212         /// <summary>
213         /// 设置Post数据
214         /// </summary>
215         /// <param name="objhttpItem">Http参数</param>
216         private void SetPostData(HttpItem objhttpItem)
217         {
218             //验证在得到结果时是否有传入数据
219             if (request.Method.Trim().ToLower().Contains("post"))
220             {
221                 byte[] buffer = null;
222                 //写入Byte类型
223                 if (objhttpItem.PostDataType == PostDataType.Byte && objhttpItem.PostdataByte != null && objhttpItem.PostdataByte.Length > 0)
224                 {
225                     //验证在得到结果时是否有传入数据
226                     buffer = objhttpItem.PostdataByte;
227                 }//写入文件
228                 else if (objhttpItem.PostDataType == PostDataType.FilePath && !string.IsNullOrEmpty(objhttpItem.Postdata))
229                 {
230                     StreamReader r = new StreamReader(objhttpItem.Postdata, encoding);
231                     buffer = Encoding.Default.GetBytes(r.ReadToEnd());
232                     r.Close();
233                 } //写入字符串
234                 else if (!string.IsNullOrEmpty(objhttpItem.Postdata))
235                 {
236                     buffer = Encoding.Default.GetBytes(objhttpItem.Postdata);
237                 }
238                 if (buffer != null)
239                 {
240                     request.ContentLength = buffer.Length;
241                     request.GetRequestStream().Write(buffer, 0, buffer.Length);
242                 }
243             }
244         }
245         /// <summary>
246         /// 设置代理
247         /// </summary>
248         /// <param name="objhttpItem">参数对象</param>
249         private void SetProxy(HttpItem objhttpItem)
250         {
251             if (!string.IsNullOrEmpty(objhttpItem.ProxyIp))
252             {
253                 //设置代理服务器
254                 WebProxy myProxy = new WebProxy(objhttpItem.ProxyIp, false);
255                 //建议连接
256                 myProxy.Credentials = new NetworkCredential(objhttpItem.ProxyUserName, objhttpItem.ProxyPwd);
257                 //给当前请求对象
258                 request.Proxy = myProxy;
259                 //设置安全凭证
260                 request.Credentials = CredentialCache.DefaultNetworkCredentials;
261             }
262         }
263         /// <summary>
264         /// 回调验证证书问题
265         /// </summary>
266         /// <param name="sender">流对象</param>
267         /// <param name="certificate">证书</param>
268         /// <param name="chain">X509Chain</param>
269         /// <param name="errors">SslPolicyErrors</param>
270         /// <returns>bool</returns>
271         public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
272         {
273             // 总是接受    
274             return true;
275         }
276         #endregion
277         #region 普通类型
278         ///<summary>
279         ///采用https协议访问网络,根据传入的URl地址,得到响应的数据字符串。
280         ///</summary>
281         ///<param name="objhttpItem">参数列表</param>
282         ///<returns>String类型的数据</returns>
283         public HttpResult GetHtml(HttpItem objhttpItem)
284         {
285             try
286             {
287                 //准备参数
288                 SetRequest(objhttpItem);
289             }
290             catch (Exception ex)
291             {
292                 return new HttpResult() { Cookie = "", Header = null, Html = ex.Message, StatusDescription = "配置参考时报错" };
293             }
294             //调用专门读取数据的类
295             return GetHttpRequestData(objhttpItem);
296         }
297         #endregion
298     }
299     /// <summary>
300     /// Http请求参考类 
301     /// </summary>
302     public class HttpItem
303     {
304         string _URL = string.Empty;
305         /// <summary>
306         /// 请求URL必须填写
307         /// </summary>
308         public string URL
309         {
310             get { return _URL; }
311             set { _URL = value; }
312         }
313         string _Method = "GET";
314         /// <summary>
315         /// 请求方式默认为GET方式,当为POST方式时必须设置Postdata的值
316         /// </summary>
317         public string Method
318         {
319             get { return _Method; }
320             set { _Method = value; }
321         }
322         int _Timeout = 100000;
323         /// <summary>
324         /// 默认请求超时时间
325         /// </summary>
326         public int Timeout
327         {
328             get { return _Timeout; }
329             set { _Timeout = value; }
330         }
331         int _ReadWriteTimeout = 30000;
332         /// <summary>
333         /// 默认写入Post数据超时间
334         /// </summary>
335         public int ReadWriteTimeout
336         {
337             get { return _ReadWriteTimeout; }
338             set { _ReadWriteTimeout = value; }
339         }
340         string _Accept = "text/html, application/xhtml+xml, */*";
341         /// <summary>
342         /// 请求标头值 默认为text/html, application/xhtml+xml, */*
343         /// </summary>
344         public string Accept
345         {
346             get { return _Accept; }
347             set { _Accept = value; }
348         }
349         string _ContentType = "text/html";
350         /// <summary>
351         /// 请求返回类型默认 text/html
352         /// </summary>
353         public string ContentType
354         {
355             get { return _ContentType; }
356             set { _ContentType = value; }
357         }
358         string _UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
359         /// <summary>
360         /// 客户端访问信息默认Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
361         /// </summary>
362         public string UserAgent
363         {
364             get { return _UserAgent; }
365             set { _UserAgent = value; }
366         }
367         Encoding _Encoding = null;
368         /// <summary>
369         /// 返回数据编码默认为NUll,可以自动识别,一般为utf-8,gbk,gb2312
370         /// </summary>
371         public Encoding Encoding
372         {
373             get { return _Encoding; }
374             set { _Encoding = value; }
375         }
376         private PostDataType _PostDataType = PostDataType.String;
377         /// <summary>
378         /// Post的数据类型
379         /// </summary>
380         public PostDataType PostDataType
381         {
382             get { return _PostDataType; }
383             set { _PostDataType = value; }
384         }
385         string _Postdata = string.Empty;
386         /// <summary>
387         /// Post请求时要发送的字符串Post数据
388         /// </summary>
389         public string Postdata
390         {
391             get { return _Postdata; }
392             set { _Postdata = value; }
393         }
394         private byte[] _PostdataByte = null;
395         /// <summary>
396         /// Post请求时要发送的Byte类型的Post数据
397         /// </summary>
398         public byte[] PostdataByte
399         {
400             get { return _PostdataByte; }
401             set { _PostdataByte = value; }
402         }
403         CookieCollection cookiecollection = null;
404         /// <summary>
405         /// Cookie对象集合
406         /// </summary>
407         public CookieCollection CookieCollection
408         {
409             get { return cookiecollection; }
410             set { cookiecollection = value; }
411         }
412         string _Cookie = string.Empty;
413         /// <summary>
414         /// 请求时的Cookie
415         /// </summary>
416         public string Cookie
417         {
418             get { return _Cookie; }
419             set { _Cookie = value; }
420         }
421         string _Referer = string.Empty;
422         /// <summary>
423         /// 来源地址,上次访问地址
424         /// </summary>
425         public string Referer
426         {
427             get { return _Referer; }
428             set { _Referer = value; }
429         }
430         string _CerPath = string.Empty;
431         /// <summary>
432         /// 证书绝对路径
433         /// </summary>
434         public string CerPath
435         {
436             get { return _CerPath; }
437             set { _CerPath = value; }
438         }
439         private Boolean isToLower = false;
440         /// <summary>
441         /// 是否设置为全文小写,默认为不转化
442         /// </summary>
443         public Boolean IsToLower
444         {
445             get { return isToLower; }
446             set { isToLower = value; }
447         }
448         private Boolean allowautoredirect = false;
449         /// <summary>
450         /// 支持跳转页面,查询结果将是跳转后的页面,默认是不跳转
451         /// </summary>
452         public Boolean Allowautoredirect
453         {
454             get { return allowautoredirect; }
455             set { allowautoredirect = value; }
456         }
457         private int connectionlimit = 1024;
458         /// <summary>
459         /// 最大连接数
460         /// </summary>
461         public int Connectionlimit
462         {
463             get { return connectionlimit; }
464             set { connectionlimit = value; }
465         }
466         private string proxyusername = string.Empty;
467         /// <summary>
468         /// 代理Proxy 服务器用户名
469         /// </summary>
470         public string ProxyUserName
471         {
472             get { return proxyusername; }
473             set { proxyusername = value; }
474         }
475         private string proxypwd = string.Empty;
476         /// <summary>
477         /// 代理 服务器密码
478         /// </summary>
479         public string ProxyPwd
480         {
481             get { return proxypwd; }
482             set { proxypwd = value; }
483         }
484         private string proxyip = string.Empty;
485         /// <summary>
486         /// 代理 服务IP
487         /// </summary>
488         public string ProxyIp
489         {
490             get { return proxyip; }
491             set { proxyip = value; }
492         }
493         private ResultType resulttype = ResultType.String;
494         /// <summary>
495         /// 设置返回类型String和Byte
496         /// </summary>
497         public ResultType ResultType
498         {
499             get { return resulttype; }
500             set { resulttype = value; }
501         }
502         private WebHeaderCollection header = new WebHeaderCollection();
503         //header对象
504         public WebHeaderCollection Header
505         {
506             get { return header; }
507             set { header = value; }
508         }
509     }
510     /// <summary>
511     /// Http返回参数类
512     /// </summary>
513     public class HttpResult
514     {
515         string _Cookie = string.Empty;
516         /// <summary>
517         /// Http请求返回的Cookie
518         /// </summary>
519         public string Cookie
520         {
521             get { return _Cookie; }
522             set { _Cookie = value; }
523         }
524         CookieCollection cookiecollection = new CookieCollection();
525         /// <summary>
526         /// Cookie对象集合
527         /// </summary>
528         public CookieCollection CookieCollection
529         {
530             get { return cookiecollection; }
531             set { cookiecollection = value; }
532         }
533         private string html = string.Empty;
534         /// <summary>
535         /// 返回的String类型数据 只有ResultType.String时才返回数据,其它情况为空
536         /// </summary>
537         public string Html
538         {
539             get { return html; }
540             set { html = value; }
541         }
542         private byte[] resultbyte = null;
543         /// <summary>
544         /// 返回的Byte数组 只有ResultType.Byte时才返回数据,其它情况为空
545         /// </summary>
546         public byte[] ResultByte
547         {
548             get { return resultbyte; }
549             set { resultbyte = value; }
550         }
551         private WebHeaderCollection header = new WebHeaderCollection();
552         //header对象
553         public WebHeaderCollection Header
554         {
555             get { return header; }
556             set { header = value; }
557         }
558         private string statusDescription = "";
559         /// <summary>
560         /// 返回状态说明
561         /// </summary>
562         public string StatusDescription
563         {
564             get { return statusDescription; }
565             set { statusDescription = value; }
566         }
567         private HttpStatusCode statusCode = HttpStatusCode.OK;
568         /// <summary>
569         /// 返回状态码,默认为OK
570         /// </summary>
571         public HttpStatusCode StatusCode
572         {
573             get { return statusCode; }
574             set { statusCode = value; }
575         }
576     }
577     /// <summary>
578     /// 返回类型
579     /// </summary>
580     public enum ResultType
581     {
582         /// <summary>
583         /// 表示只返回字符串 只有Html有数据
584         /// </summary>
585         String,
586         /// <summary>
587         /// 表示返回字符串和字节流 ResultByte和Html都有数据返回
588         /// </summary>
589         Byte
590     }
591     /// <summary>
592     /// Post的数据格式默认为string
593     /// </summary>
594     public enum PostDataType
595     {
596         /// <summary>
597         /// 字符串类型,这时编码Encoding可不设置
598         /// </summary>
599         String,
600         /// <summary>
601         /// Byte类型,需要设置PostdataByte参数的值编码Encoding可设置为空
602         /// </summary>
603         Byte,
604         /// <summary>
605         /// 传文件,Postdata必须设置为文件的绝对路径,必须设置Encoding的值
606         /// </summary>
607         FilePath
608     }
609 }

 

posted @ 2013-06-28 05:40  第★一★次  阅读(3128)  评论(13编辑  收藏  举报