• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想的思想
很久很久以前,谎言和真实在河边洗澡,谎言先洗好,穿了真实的衣服离开, 真实却不肯穿谎言的衣服。后来,在人们的眼里,只有穿着真实衣服的谎言,却很难接受赤裸裸的真实
博客园    首页    新随笔    联系   管理    订阅  订阅

[C#]基于HttpWebRequest和HttpWebResponse的HttpHelper

[C#]基于HttpWebRequest和HttpWebResponse的HttpHelper

C#中实现POST的方法很多,常用的是WebBrowser、WebClient、HttpWebRequest和HttpWebResponse。

1、WebBrowser基本是在DocumentCompleted中分析HtmlDocument ;

2、WebClient是对HttpWebRequest和HttpWebResponse的封装,用起来更方便,但是灵活性还是不及HttpWebRequest和HttpWebResponse;

3、HttpWebRequest和HttpWebResponse更底层,灵活度更好,不过代码更多,我做了一个简单的封装,将GET改成分段读取,并加入代理、进度条和错误重试处理。代码如下:

 

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Van.Base
{
    public class HttpHelper
    {
        #region 委托 事件
        public delegate void dgtProgValueChanged(long Value);
        /// <summary>
        
/// 进度改变事件
        
/// </summary>
        public event dgtProgValueChanged OnProgValueChanged;
        #endregion

        #region 属性
        /// <summary>
        
/// 代理
        
/// </summary>
        public WebProxy Proxy { get; set; }
        /// <summary>
        
/// Cookie
        
/// </summary>
        public CookieContainer UserCookie { get; set; }
        /// <summary>
        
/// 重试次数
        
/// </summary>
        public int IAfreshTime { get; set; }
        /// <summary>
        
/// 错误次数
        
/// </summary>
        public int IErrorTime { get; private set; }

        long m_ProgValue = 0;
        /// <summary>
        
/// 当前读取字节
        
/// </summary>
        public long ProgValue
        {
            get { return m_ProgValue; }
            private set
            {
                m_ProgValue = value;
                if (OnProgValueChanged != null)
                {
                    OnProgValueChanged(value);
                }
            }
        }
        /// <summary>
        
/// 待读取最大字节
        
/// </summary>
        public long ProgMaximum { get; private set; }

        #endregion

        #region 方法
        #region Get
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="URL">地址</param>
        
/// <param name="Accept">Accept请求头</param>
        
/// <returns>Html代码</returns>
        public string GetHTML(string URL, string Accept)
        {
            return GetHTML(URL, Accept, System.Text.Encoding.UTF8);
        }
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="URL">地址</param>
        
/// <param name="Accept">Accept请求头</param>
        
/// <param name="encoding">字符编码</param>
        
/// <returns>Html代码</returns>
        public string GetHTML(string URL, string Accept, Encoding encoding)
        {
            return GetHTML(URL, Accept, encoding, 1024);
        }
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="URL">地址</param>
        
/// <param name="Accept">Accept请求头</param>
        
/// <param name="encoding">字符编码</param>
        
/// <param name="bufflen">数据包大小</param>
        
/// <returns>Html代码</returns>
        public string GetHTML(string URL, string Accept, Encoding encoding, int bufflen)
        {
            IErrorTime = 0;
            return _GetHTML(URL, Accept, encoding, bufflen);
        }
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="URL">地址</param>
        
/// <param name="Accept">Accept请求头</param>
        
/// <param name="encoding">字符编码</param>
        
/// <param name="bufflen">数据包大小</param>
        
/// <returns>Html代码</returns>
        private string _GetHTML(string URL, string Accept, Encoding encoding,int bufflen)
        {
            try
            {
                HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
                MyRequest.Proxy = Proxy;
                MyRequest.Accept = Accept;
                if (UserCookie == null)
                {
                    UserCookie = new CookieContainer();
                }
                MyRequest.CookieContainer = UserCookie;
                HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
                return _GetHTML(MyResponse, encoding, bufflen);
            }
            catch (Exception erro)
            {
                if (erro.Message.Contains("连接") && IAfreshTime - IErrorTime > 0)
                {
                    IErrorTime++;
                    return _GetHTML(URL, Accept, encoding, bufflen);
                }
                throw;
            }
        }
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="MyResponse"></param>
        
/// <param name="encoding">字符编码</param>
        
/// <param name="bufflen">数据包大小</param>
        
/// <returns></returns>
        private string _GetHTML(HttpWebResponse MyResponse, Encoding encoding, int bufflen)
        {
            using (Stream MyStream = MyResponse.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(MyStream, encoding))
                {
                    ProgMaximum = MyResponse.ContentLength;
                    string result = null;
                    long totalDownloadedByte = 0;
                    byte[] by = new byte[bufflen];
                    int osize = MyStream.Read(by, 0, by.Length);
                    while (osize > 0)
                    {
                        totalDownloadedByte = osize + totalDownloadedByte;
                        result += encoding.GetString(by, 0, osize);
                        ProgValue = totalDownloadedByte;
                        osize = MyStream.Read(by, 0, by.Length);
                    }
                    reader.Close();
                    return result;
                }
            }
        }
        #endregion


        #region GetImg

        public System.Drawing.Bitmap Getimg(string URL, string Accept)
        {
            return _GetBit(URL, Accept);
        }
        /// <summary>
        
/// 获取HTML
        
/// </summary>
        
/// <param name="URL">地址</param>
        
/// <param name="Accept">Accept请求头</param>
        
/// <returns>Html代码</returns>
        private System.Drawing.Bitmap _GetBit(string URL, string Accept)
        {
            HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
            MyRequest.Proxy = Proxy;
            MyRequest.Accept = Accept;
            if (UserCookie == null)
            {
                UserCookie = new CookieContainer();
            }
            MyRequest.CookieContainer = UserCookie;
            HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
            return _GetBit(MyResponse);
        }

        /// <summary>
        
/// 获取图像
        
/// </summary>
        
/// <param name="MyResponse"></param>
        
/// <returns></returns>
        private System.Drawing.Bitmap _GetBit(HttpWebResponse MyResponse)
        {
            using (Stream MyStream = MyResponse.GetResponseStream())
            {
                return new System.Drawing.Bitmap(MyStream);
            }
        }
        #endregion

        #region Post
        /// <summary>
        
/// 回发(字符编码默认UTF-8)
        
/// </summary>
        
/// <param name="URL">回发地址</param>
        
/// <param name="PostData">参数</param>
        
/// <returns>Html代码</returns>
        public string PostPage(string URL, string PostData)
        {
            return PostPage(URL, PostData, System.Text.Encoding.UTF8);
        }
        /// <summary>
        
/// 回发
        
/// </summary>
        
/// <param name="URL">回发地址</param>
        
/// <param name="PostData">参数</param>
        
/// <param name="encoding">字符编码</param>
        
/// <returns>Html代码</returns>
        public string PostPage(string URL, string PostData, Encoding encoding)
        {
            return PostPage(URL, PostData, encoding, null);
        }
        /// <summary>
        
/// 回发
        
/// </summary>
        
/// <param name="URL">回发地址</param>
        
/// <param name="PostData">参数</param>
        
/// <param name="encoding">字符编码</param>
        
/// <returns>Html代码</returns>
        public string PostPage(string URL, string PostData, Encoding encoding, string ContentType)
        {
            IErrorTime = 0;
            return _PostPage(URL, PostData, encoding, ContentType);
        }
        /// <summary>
        
/// 回发
        
/// </summary>
        
/// <param name="URL">回发地址</param>
        
/// <param name="PostData">参数</param>
        
/// <param name="encoding">字符编码</param>
        
/// <returns>Html代码</returns>
        private string _PostPage(string URL, string PostData, Encoding encoding,string ContentType)
        {
            try
            {
                if (ContentType==null)
                {
                    ContentType = "application/x-www-form-urlencoded";
                }
                HttpWebRequest MyRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
                MyRequest.Proxy = Proxy;
                if (UserCookie == null)
                {
                    UserCookie = new CookieContainer();
                }
                MyRequest.CookieContainer = UserCookie;
                MyRequest.Method = "POST";
                MyRequest.ContentType = ContentType;
                byte[] b = encoding.GetBytes(PostData);
                MyRequest.ContentLength = b.Length;
                using (System.IO.Stream sw = MyRequest.GetRequestStream())
                {
                    try
                    {
                        sw.Write(b, 0, b.Length);
                    }
                    catch
                    {
                    }
                }
                HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
                return _GetHTML(MyResponse, encoding, 1024);
            }
            catch (Exception erro)
            {
                if (erro.Message.Contains("连接") && IAfreshTime - IErrorTime > 0)
                {
                    IErrorTime++;
                    return _PostPage(URL, PostData, encoding, ContentType);
                }
                throw;
            }
        }
        #endregion
        #endregion
    }
}

 

调用便很方便了,如下:

 

string strProxyAdd = "www.Proxyxxxx.com", UserName = "XXXX",PassWord = "XXX";
int port = 8080;


HttpHelper http = new HttpHelper();
http.Proxy = new WebProxy();//设置代理
this.http.Proxy.Address = new Uri(string.Format("http://{0}:{1}", strProxyAdd,port));//设置代理服务器地址和端口
this.http.Proxy.Credentials = new NetworkCredential(UserName, PassWord);//设置代理用户名密码
//http.Proxy = null;//清空代理

var strPHtml = http.PostPage("www.xxxx.com", "User=ABCD&Pwd=DEF");//向www.xxxx.com POST数据User=ABCD&Pwd=DEF

var strHtml = http.GetHTML("www.xxxx.com", "*/*", Encoding.UTF8, 20480);//从www.xxxx.com获取HTML数据,并用UTF8进行编码

由于Cookie在一个实例中是共用的,在一些场景下可以先POST登录后再GET需要登录才能进入的页面信息。 

posted @ 2011-11-18 15:51  混世魔王  阅读(495)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3