有些朋友说 WebClient 不能保持 Session 和 Cookie,只有 HttpWebRequest 才能保持 Session。实际上我们只要重写 WebClient 的 GetWebRequest 方法就可以使 WebClient 保持 Session 和 Cookie。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
下面是 HttpClient 类, 它继承自 WebClient,并重写了 GetWebRequest 方法。
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
/// 支持 Session 和 Cookie 的 WebClient。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
public class HttpClient : WebClient „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
// Cookie 容器„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
private CookieContainer cookieContainer;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 创建一个新的 WebClient 实例。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public HttpClient()„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
this.cookieContainer = new CookieContainer();„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 创建一个新的 WebClient 实例。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="cookie">Cookie 容器</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public HttpClient(CookieContainer cookies)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
this.cookieContainer = cookies;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// Cookie 容器„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public CookieContainer Cookies„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
get { return this.cookieContainer; }„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
set { this.cookieContainer = value; }„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 返回带有 Cookie 的 HttpWebRequest。„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="address"></param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <returns></returns>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    protected override WebRequest GetWebRequest(Uri address)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        WebRequest request
= base.GetWebRequest(address);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
if (request is HttpWebRequest)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            HttpWebRequest httpRequest
= request as HttpWebRequest;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            httpRequest.CookieContainer
= cookieContainer;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
return request;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
#region 封装了PostData, GetSrc 和 GetFile 方法„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 向指定的 URL POST 数据,并返回页面„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="uriString">POST URL</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="postString">POST 的 数据</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="postStringEncoding">POST 数据的 CharSet</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="dataEncoding">页面的 CharSet</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <returns>页面的源文件</returns>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public string PostData(string uriString, string postString, string postStringEncoding, string dataEncoding, out„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
string msg)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
try„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 将 Post 字符串转换成字节数组„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
byte[] postData = Encoding.GetEncoding(postStringEncoding).GetBytes(postString);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
this.Headers.Add("Content-Type", "application/x-www-form-urlencoded");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 上传数据,返回页面的字节数组„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
byte[] responseData = this.UploadData(uriString, "POST", postData);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 将返回的将字节数组转换成字符串(HTML);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\t", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\r", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\n", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= string.Empty;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return srcString;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
catch (WebException we)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= we.Message;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return string.Empty;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 获得指定 URL 的源文件„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="uriString">页面 URL</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="dataEncoding">页面的 CharSet</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <returns>页面的源文件</returns>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public string GetSrc(string uriString, string dataEncoding, out string msg)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
try„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 返回页面的字节数组„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
byte[] responseData = this.DownloadData(uriString);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
// 将返回的将字节数组转换成字符串(HTML);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\t", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\r", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            srcString
= srcString.Replace("\n", "");„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= string.Empty;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return srcString;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
catch (WebException we)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= we.Message;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return string.Empty;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// 从指定的 URL 下载文件到本地„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// </summary>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="uriString">文件 URL</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <param name="fileName">本地文件的完成路径</param>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
/// <returns></returns>„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    public bool GetFile(string urlString, string fileName, out string msg)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
try„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
this.DownloadFile(urlString, fileName);„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= string.Empty;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return true;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
catch (WebException we)„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
       
{„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
            msg
= we.Message;              „hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
           
return false;„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
        }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
    }
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
   
#endregion„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½
}
„hQŸàÕE÷www.netcsharp.cní£ê1½”‡z½