实际上,这段代码是网上的,但是由于设置Cookie相对麻烦,所以增加了设置Cookie的方法.
另外,对Cookie中的’,’符号进行了转意,用了3个多月了,没有发现有什么问题,好久没有发文章了,今天抽空就发出来把 ^ ^
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
namespace JointOfficial.Model
{
/// <summary>
/// 支持 Session 和 Cookie 的 WebClient。
/// </summary>
public class HttpClient : WebClient
{
// Cookie 容器
private CookieContainer cookieContainer;
/// <summary>
/// 创建一个新的 WebClient 实例。
/// </summary>
public HttpClient()
{
this.cookieContainer = new CookieContainer();
}
/// <summary>
/// 创建一个新的 WebClient 实例。
/// </summary>
/// <param name="cookie">Cookie 容器</param>
public HttpClient(CookieContainer cookies)
{
this.cookieContainer = cookies;
}
/// <summary>
/// Cookie 容器
/// </summary>
public CookieContainer Cookies
{
get { return this.cookieContainer; }
set { this.cookieContainer = value; }
}
/// <summary>
/// 坑爹之用
/// </summary>
public object Tag { get; set; }
/// <summary>
/// 设置Cookie
/// </summary>
/// <param name="cookieString" type="string">
/// <para>
/// 以String存储的Cookie
/// </para>
/// </param>
/// <param name="domain" type="string">
/// <para>
/// Cookie的作用域
/// </para>
/// </param>
/// <returns>
/// A System.Net.CookieContainer value...
/// </returns>
public CookieContainer SetCookies(string cookieString, string domain)
{
string[] tempCookies = cookieString.Split(';');
string tempCookie = null;
int Equallength = 0;// =的位置
string cookieKey = null;
string cookieValue = null;
CookieContainer cc = new CookieContainer();
for (int i = 0; i < tempCookies.Length; i++)
{
if (!string.IsNullOrEmpty(tempCookies[i]))
{
tempCookie = tempCookies[i];
Equallength = tempCookie.IndexOf("=");
if (Equallength != -1) //有可能cookie 无=,就直接一个cookiename;比如:a=3;ck;abc=;
{
cookieKey = tempCookie.Substring(0, Equallength).Trim();
if (Equallength == tempCookie.Length - 1) //这种是等号后面无值,如:abc=;
{
cookieValue = "";
}
else
{
cookieValue = tempCookie.Substring(Equallength + 1, tempCookie.Length - Equallength - 1).Trim();
}
}
else
{
cookieKey = tempCookie.Trim();
cookieValue = "";
}
cookieValue = cookieValue.Replace(",", "%2C");//针对Cookie中的特殊符号','进行转换
cc.Add(new Cookie(cookieKey, cookieValue, "", domain));
}
}
this.Cookies = cc;
return cc;
}
/// <summary>
/// 返回带有 Cookie 的 HttpWebRequest。
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
HttpWebRequest httpRequest = request as HttpWebRequest;
httpRequest.CookieContainer = cookieContainer;
}
return request;
}
#region 封装了PostData, GetSrc 和 GetFile 方法
/// <summary>
/// 向指定的 URL POST 数据,并返回页面
/// </summary>
/// <param name="uriString">POST URL</param>
/// <param name="postString">POST 的 数据</param>
/// <param name="postStringEncoding">POST 数据的 CharSet</param>
/// <param name="dataEncoding">页面的 CharSet</param>
/// <returns>页面的源文件</returns>
public string PostData(string uriString, string postString, string postStringEncoding, string dataEncoding, out string msg)
{
try
{
// 将 Post 字符串转换成字节数组
byte[] postData = Encoding.GetEncoding(postStringEncoding).GetBytes(postString);
this.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
// 上传数据,返回页面的字节数组
byte[] responseData = this.UploadData(uriString, "POST", postData);
// 将返回的将字节数组转换成字符串(HTML);
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString = srcString.Replace("\t", "");
srcString = srcString.Replace("\r", "");
srcString = srcString.Replace("\n", "");
msg = string.Empty;
return srcString;
}
catch (WebException we)
{
msg = we.Message;
return string.Empty;
}
}
/// <summary>
/// 获得指定 URL 的源文件
/// </summary>
/// <param name="uriString">页面 URL</param>
/// <param name="dataEncoding">页面的 CharSet</param>
/// <returns>页面的源文件</returns>
public string GetSrc(string uriString, string dataEncoding, out string msg)
{
try
{
// 返回页面的字节数组
byte[] responseData = this.DownloadData(uriString);
// 将返回的将字节数组转换成字符串(HTML);
string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString = srcString.Replace("\t", "");
srcString = srcString.Replace("\r", "");
srcString = srcString.Replace("\n", "");
msg = string.Empty;
return srcString;
}
catch (WebException we)
{
msg = we.Message;
return string.Empty;
}
}
/// <summary>
/// 从指定的 URL 下载文件到本地
/// </summary>
/// <param name="uriString">文件 URL</param>
/// <param name="fileName">本地文件的完成路径</param>
/// <returns></returns>
public bool GetFile(string urlString, string fileName, out string msg)
{
try
{
this.DownloadFile(urlString, fileName);
msg = string.Empty;
return true;
}
catch (WebException we)
{
msg = we.Message;
return false;
}
}
#endregion
}
}
代码盲飘过。。
楼上搞笑
哈哈
哇,全看懂了。依然飘过。很实用