C# HttpWebRequest 通用类1 - 转

/*

使用方法:
MyHttp loHttp = new MyHttp();
string lcHtml = "";

loHttp.HandleCookies = true;//操作Cookies
loHttp.Method = "GET";
lcHtml = loHttp.GetUrl("
http://signin.ebay.com.cn/ws2/eBayISAPI.dll?SignIn&ssPageName=h:h:sout:CN");

loHttp.AddPostKey("Key", "Value");
loHttp.Referer = "
http://signin.ebay.com.cn/ws2/eBayISAPI.dll?SignIn&ssPageName=h:h:sout:CN";

loHttp.Method = "POST";
lcHtml = loHttp.GetUrl("
http://signin.ebay.com.cn/ws2/eBayISAPI.dll");

MessageBox.Show(loHttp.ErrorMsg);
MessageBox.Show(lcHtml);

*/

using System;
using System.Collections;
using System.Text;
using System.Web;
using System.Windows.Forms;//only For Use MessageBox
using System.Net;
using System.IO;
using System.Diagnostics;

namespace HttpWeb
{
    
public class MyHttp
    {
        
/// <summary>
        
/// User name used for Authentication. 
        
/// To use the currently logged in user when accessing an NTLM resource you can use "AUTOLOGIN".
        
/// </summary>
        public string Username
        {
            
get { return this.cUsername; }
            
set { cUsername = value; }
        }

        
/// <summary>
        
/// Password for Authentication.
        
/// </summary>
        public string Password
        {
            
get { return this.cPassword; }
            
set { this.cPassword = value; }
        }

        
/// <summary>
        
/// Address of the Proxy Server to be used.
        
/// Use optional DEFAULTPROXY value to specify that you want to IE's Proxy Settings
        
/// </summary>
        public string ProxyAddress
        {
            
get { return this.cProxyAddress; }
            
set { this.cProxyAddress = value; }
        }

        
/// <summary>
        
/// Semicolon separated Address list of the servers the proxy is not used for.
        
/// </summary>
        public string ProxyBypass
        {
            
get { return this.cProxyBypass; }
            
set { this.cProxyBypass = value; }
        }

        
/// <summary>
        
/// Username for a password validating Proxy. Only used if the proxy info is set.
        
/// </summary>
        public string ProxyUsername
        {
            
get { return this.cProxyUsername; }
            
set { this.cProxyUsername = value; }
        }
        
/// <summary>
        
/// Password for a password validating Proxy. Only used if the proxy info is set.
        
/// </summary>
        public string ProxyPassword
        {
            
get { return this.cProxyPassword; }
            
set { this.cProxyPassword = value; }
        }

        
/// <summary>
        
/// Timeout for the Web request in seconds. Times out on connection, read and send operations.
        
/// Default is 30 seconds.
        
/// </summary>
        public int Timeout
        {
            
get { return this.nConnectTimeout; }
            
set { this.nConnectTimeout = value; }
        }



        
public bool HandleReferer
        {
            
get { return this.bHandleReferer; }
            
set { this.bHandleReferer = value; }
        }

        
/// <summary>
        
/// 引用页
        
/// </summary>
        public string Referer
        {
            
get { return this.cReferer; }
            
set { this.cReferer = value; }
        }

        
/// <summary>
        
/// 提交模式,默认是POST,用GET模式的时候不能使用PostData
        
/// </summary>
        
/// <value></value>
        public string Method
        {
            
get { return this.cMethod; }
            
set { this.cMethod = value; }
        }
        
/// <summary>
        
/// Error Message if the Error Flag is set or an error value is returned from a method.
        
/// </summary>
        public string ErrorMsg
        {
            
get { return this.cErrorMsg; }
            
set { this.cErrorMsg = value; }
        }

        
/// <summary>
        
/// Error flag if an error occurred.
        
/// </summary>
        public bool Error
        {
            
get { return this.bError; }
            
set { this.bError = value; }
        }

        
/// <summary>
        
/// Determines whether errors cause exceptions to be thrown. By default errors 
        
/// are handled in the class and the Error property is set for error conditions.
        
/// (not implemented at this time).
        
/// </summary>
        public bool ThrowExceptions
        {
            
get { return bThrowExceptions; }
            
set { this.bThrowExceptions = value; }
        }

        
/// <summary>
        
/// If set to a non-zero value will automatically track cookies. The number assigned is the cookie count.
        
/// </summary>
        public bool HandleCookies
        {
            
get { return this.bHandleCookies; }
            
set { this.bHandleCookies = value; }
        }
        
//Cookies集合
        public CookieCollection Cookies
        {
            
get { return this.oCookies; }
            
set { this.oCookies = value; }
        }

        
//默认的编码
        public string MyEncoding
        {
            
get { return this.cEncoding; }
            
set { this.cEncoding = value; }
        }

        
//自动跳转到新的页面
        public bool Location
        {
            
get { return this.bLocation; }
            
set { this.bLocation = value; }
        }
        
// *** member properties
        string cPostData = ""//提交的数据
        int nConnectTimeout = 180//超时
        string cUserAgent = " Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322)"//用户代理
        bool bHandleReferer = true//自动操作引用页
        string cReferer = ""//引用页
        string cMethod = "POST"//提交模式POST ro GET
        string cUsername = "";
        
string cPassword = "";
        
string cProxyAddress = "";
        
string cProxyBypass = "";
        
string cProxyUsername = "";
        
string cProxyPassword = "";
        
bool bThrowExceptions = true//是否抛出异常
        bool bHandleCookies = true//自动操作Cookies
        CookieCollection oCookies;
        
string cErrorMsg = ""//错误返回
        bool bError = false;
        
string cEncoding = "GB2312";//UTF-8 GB2312
        bool bLocation = false;

        
public MyHttp() { }

        
/// <summary>
        
/// 增加提交的值
        
/// </summary>
        
/// <param name="Key"></param>
        
/// <param name="Value"></param>
        public void AddPostKey(string Key, string Value)
        {
            cPostData 
+= Key + "=" + System.Web.HttpUtility.UrlEncode(Value, System.Text.Encoding.GetEncoding("GB2312")) + "&";
        }

        
/// <summary>
        
/// 增加提交的连续值(完整或者部分完整值)
        
/// </summary>
        
/// <param name="FullPostBuffer"></param>
        public void AddPostKey(string FullPostBuffer)
        {
            cPostData 
+= FullPostBuffer;
        }







        
public string GetUrl(string Url)
        {
            Url 
= UrlEncode(Url);
            Debug.WriteLine(Url);
            
try
            {
                
this.bError = false;
                
this.cErrorMsg = "";

                
//通用的属性
                HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(Url);
                Request.UserAgent 
= this.cUserAgent;
                Request.Timeout 
= this.nConnectTimeout * 1000;
                Request.Accept 
= "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*";
                Request.Referer 
= this.cReferer;
                
//Request.Connection = "keep-alive";

                
// 需要安全验证的访问
                if (this.cUsername.Length > 0)
                {
                    
if (this.cUsername == "AUTOLOGIN")
                        Request.Credentials 
= CredentialCache.DefaultCredentials;
                    
else
                        Request.Credentials 
= new NetworkCredential(this.cUsername, this.cPassword);
                }

                
// 需要使用Proxy和其配置
                if (this.cProxyAddress.Length > 0)
                {
                    
if (this.cProxyAddress == "DEFAULTPROXY")
                    {
                        Request.Proxy 
= new WebProxy();
                        Request.Proxy 
= WebProxy.GetDefaultProxy();
                    }
                    
else
                    {
                        WebProxy loProxy 
= new WebProxy(this.cProxyAddress, true);
                        
if (this.cProxyBypass.Length > 0)
                        {
                            loProxy.BypassList 
= this.cProxyBypass.Split(';');
                        }

                        
if (this.cProxyUsername.Length > 0)
                            loProxy.Credentials 
= new NetworkCredential(this.cProxyUsername, this.cProxyPassword);

                        Request.Proxy 
= loProxy;
                    }
                }

                
// 需要操作Cookies和自动重用Cookies
                if (this.bHandleCookies)
                {
                    Request.CookieContainer 
= new CookieContainer();
                    
if (this.oCookies != null && this.oCookies.Count > 0)
                    {
                        Request.CookieContainer.Add(
this.oCookies);
                    }
                }

                Request.Method 
= cMethod;//设置提交模式

                
if (this.cMethod == "POST")
                {
                    Request.ContentType 
= "application/x-www-form-urlencoded";
                    
if (this.cPostData.EndsWith("&"))
                        
this.cPostData = this.cPostData.Substring(0this.cPostData.Length - 1);

                    
//MessageBox.Show(this.cPostData);

                    
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(cEncoding).GetBytes(cPostData);
                    Request.ContentLength 
= lbPostBuffer.Length;
                    Stream loPostData 
= Request.GetRequestStream();

                    loPostData.Write(lbPostBuffer, 
0, lbPostBuffer.Length);
                    loPostData.Close();

                    
// *** clear the POST buffer
                    this.cPostData = "";
                }

                
// *** Retrieve the response headers 
                HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();

                
// ** Save cookies the server sends
                if (this.bHandleCookies)
                {
                    
if (Response.Cookies.Count > 0)
                    {
                        
if (this.oCookies == null)
                        {
                            
this.oCookies = Response.Cookies;
                        }
                        
else
                        {
                            
// ** If we already have cookies update the list
                            foreach (Cookie oRespCookie in Response.Cookies)
                            {
                                
bool bMatch = false;
                                
foreach (Cookie oReqCookie in this.oCookies)
                                {
                                    
if (oReqCookie.Name == oRespCookie.Name)
                                    {
                                        oReqCookie.Value 
= oRespCookie.Value;
                                        bMatch 
= true;
                                        
break// 
                                    }
                                } 
// for each ReqCookies
                                if (!bMatch)
                                    
this.oCookies.Add(oRespCookie);
                            } 
// for each Response.Cookies
                        } // this.Cookies == null
                    } // if Response.Cookie.Count > 0
                } // if this.bHandleCookies = 0


                
// *** Save the response object for external access
                Encoding enc;
                
try
                {
                    
if (Response.ContentEncoding.Length > 0)
                        enc 
= Encoding.GetEncoding(Response.ContentEncoding);
                    
else
                        enc 
= Encoding.GetEncoding(cEncoding);
                }
                
catch
                {
                    
// *** Invalid encoding passed
                    enc = Encoding.GetEncoding(cEncoding);
                }

                
// *** drag to a stream
                StreamReader strResponse = new StreamReader(Response.GetResponseStream(), enc);
                
string str = strResponse.ReadToEnd();
                Response.Close();
                strResponse.Close();
                
//自动跟踪引用页
                if (this.bHandleReferer)
                {
                    
this.cReferer = Url;
                }
                
//自动处理HTTP/1.0 302 Moved Temporarily中的Location后的页面。(自动完成跳转)
                if (this.bLocation)
                {

                    
//这里需要自动获得跳转页面的地址。并且再次使用这个方法访问页面
                }
                
return str;
            }
            
catch (Exception e)
            {
                
if (this.bThrowExceptions)
                    
throw e;
                
this.cErrorMsg = e.Message;
                
this.bError = true;
                
return null;
            }
        }
        
private string UrlEncode(string url)
        {
            
byte[] bs = Encoding.GetEncoding("gb2312").GetBytes(url);
            StringBuilder sb 
= new StringBuilder();
            
for (int i = 0; i < bs.Length; i++)
            {
                
if (bs[i] < 128)
                    sb.Append((
char)bs[i]);
                
else
                {
                    sb.Append(
"%" + bs[i++].ToString("x").PadLeft(2'0'));
                    sb.Append(
"%" + bs[i].ToString("x").PadLeft(2'0'));
                }
            }
            
return sb.ToString();
        }


    }
}
posted @ 2009-07-17 11:23  afish1984  阅读(1609)  评论(0编辑  收藏  举报