分享

C# 实现http协议GET、POST请求类 - 大家新闻网 - Powered by S...

 大卷风 2010-11-07

 时间:2010年6月16日 20:38

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.IO;

using System.Net;

using System.Net.Security;

using System.Security.Cryptography.X509Certificates;

using System.IO.Compression;

using System.Net.Cache;

namespace HttpProc

{

///

/// 上传数据参数

///

public class UploadEventArgs : EventArgs

{

int bytesSent;

int totalBytes;

///

/// 已发送的字节数

///

public int BytesSent

{

get { return bytesSent; }

set { bytesSent = value; }

}

///

/// 总字节数

///

public int TotalBytes

{

get { return totalBytes; }

set { totalBytes = value; }

}

}

///

/// 下载数据参数

///

public class DownloadEventArgs : EventArgs

{

int bytesReceived;

int totalBytes;

byte[] receivedData;

///

/// 已接收的字节数

///

public int BytesReceived

{

get { return bytesReceived; }

set { bytesReceived = value; }

}

///

/// 总字节数

///

public int TotalBytes

{

get { return totalBytes; }

set { totalBytes = value; }

}

///

/// 当前缓冲区接收的数据

///

public byte[] ReceivedData

{

get { return receivedData; }

set { receivedData = value; }

}

}

public class WebClient

{

Encoding encoding = Encoding.Default;

string respHtml = "";

WebProxy proxy;

static CookieContainer cc;

WebHeaderCollection requestHeaders;

WebHeaderCollection responseHeaders;

int bufferSize = 15240;

public event EventHandler UploadProgressChanged;

public event EventHandler DownloadProgressChanged;

static WebClient()

{

LoadCookiesFromDisk();

}

///

/// 创建WebClient的实例

///

public WebClient()

{

requestHeaders = new WebHeaderCollection();

responseHeaders = new WebHeaderCollection();

}

///

/// 设置发送和接收的数据缓冲大小

///

public int BufferSize

{

get { return bufferSize; }

set { bufferSize = value; }

}

///

/// 获取响应头集合

///

public WebHeaderCollection ResponseHeaders

{

get { return responseHeaders; }

}

///

/// 获取请求头集合

///

public WebHeaderCollection RequestHeaders

{

get { return requestHeaders; }

}

///

/// 获取或设置代理

///

public WebProxy Proxy

{

get { return proxy; }

set { proxy = value; }

}

///

/// 获取或设置请求与响应的文本编码方式

///

public Encoding Encoding

{

get { return encoding; }

set { encoding = value; }

}

///

/// 获取或设置响应的html代码

///

public string RespHtml

{

get { return respHtml; }

set { respHtml = value; }

}

///

/// 获取或设置与请求关联的Cookie容器

///

public CookieContainer CookieContainer

{

get { return cc; }

set { cc = value; }

}

///

/// 获取网页源代码

///

/// 网址

///

public string GetHtml(string url)

{

HttpWebRequest request = CreateRequest(url, "GET");

respHtml = encoding.GetString(GetData(request));

return respHtml;

}

///

/// 下载文件

///

/// 文件URL地址

/// 文件保存完整路径

public void DownloadFile(string url, string filename)

{

FileStream fs = null;

try

{

HttpWebRequest request = CreateRequest(url, "GET");

byte[] data = GetData(request);

fs = new FileStream(filename, FileMode.Create, FileAccess.Write);

fs.Write(data, 0, data.Length);

}

finally

{

if (fs != null) fs.Close();

}

}

///

/// 从指定URL下载数据

///

/// 网址

///

public byte[] GetData(string url)

{

HttpWebRequest request = CreateRequest(url, "GET");

return GetData(request);

}

///

/// 向指定URL发送文本数据

///

/// 网址

/// urlencode编码的文本数据

///

public string Post(string url, string postData)

{

byte[] data = encoding.GetBytes(postData);

return Post(url, data);

}

///

/// 向指定URL发送字节数据

///

/// 网址

/// 发送的字节数组

///

public string Post(string url, byte[] postData)

{

HttpWebRequest request = CreateRequest(url, "POST");

request.ContentType = "application/x-www-form-urlencoded";

request.ContentLength = postData.Length;

request.KeepAlive = true;

PostData(request, postData);

respHtml = encoding.GetString(GetData(request));

return respHtml;

}

///

/// 向指定网址发送mulitpart编码的数据

///

/// 网址

/// mulitpart form data

///

public string Post(string url, MultipartForm mulitpartForm)

{

HttpWebRequest request = CreateRequest(url, "POST");

request.ContentType = mulitpartForm.ContentType;

request.ContentLength = mulitpartForm.FormData.Length;

request.KeepAlive = true;

PostData(request, mulitpartForm.FormData);

respHtml = encoding.GetString(GetData(request));

return respHtml;

}

///

/// 读取请求返回的数据

///

/// 请求对象

///

private byte[] GetData(HttpWebRequest request)

{

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream stream = response.GetResponseStream();

responseHeaders = response.Headers;

SaveCookiesToDisk();

DownloadEventArgs args = new DownloadEventArgs();

if (responseHeaders[HttpResponseHeader.ContentLength] != null)

args.TotalBytes = Convert.ToInt32(responseHeaders[HttpResponseHeader.ContentLength]);

MemoryStream ms = new MemoryStream();

int count = 0;

byte[] buf = new byte[bufferSize];

while ((count = stream.Read(buf, 0, buf.Length)) > 0)

{

ms.Write(buf, 0, count);

if (this.DownloadProgressChanged != null)

{

args.BytesReceived += count;

args.ReceivedData = new byte[count];

Array.Copy(buf, args.ReceivedData, count);

this.DownloadProgressChanged(this, args);

}

}

stream.Close();

//解压

if (ResponseHeaders[HttpResponseHeader.ContentEncoding] != null)

{

MemoryStream msTemp = new MemoryStream();

count = 0;

buf = new byte[100];

switch (ResponseHeaders[HttpResponseHeader.ContentEncoding].ToLower())

{

case "gzip":

GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress);

while ((count = gzip.Read(buf, 0, buf.Length)) > 0)

{

msTemp.Write(buf, 0, count);

}

return msTemp.ToArray();

case "deflate":

DeflateStream deflate = new DeflateStream(ms, CompressionMode.Decompress);

while ((count = deflate.Read(buf, 0, buf.Length)) > 0)

{

msTemp.Write(buf, 0, count);

}

return msTemp.ToArray();

default:

break;

}

}

return ms.ToArray();

}

///

/// 发送请求数据

///

/// 请求对象

/// 请求发送的字节数组

private void PostData(HttpWebRequest request, byte[] postData)

{

int offset = 0;

int sendBufferSize = bufferSize;

int remainBytes = 0;

Stream stream = request.GetRequestStream();

UploadEventArgs args = new UploadEventArgs();

args.TotalBytes = postData.Length;

while ((remainBytes = postData.Length - offset) > 0)

{

if (sendBufferSize > remainBytes) sendBufferSize = remainBytes;

stream.Write(postData, offset, sendBufferSize);

offset += sendBufferSize;

if (this.UploadProgressChanged != null)

{

args.BytesSent = offset;

this.UploadProgressChanged(this, args);

}

}

stream.Close();

}

///

/// 创建HTTP请求

///

/// URL地址

///

private HttpWebRequest CreateRequest(string url, string method)

{

Uri uri = new Uri(url);

if (uri.Scheme == "https")

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(this.CheckValidationResult);

// Set a default policy level for the "http:" and "https" schemes.

HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Revalidate);

HttpWebRequest.DefaultCachePolicy = policy;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

request.AllowAutoRedirect = false;

request.AllowWriteStreamBuffering = false;

request.Method = method;

if (proxy != null) request.Proxy = proxy;

request.CookieContainer = cc;

foreach (string key in requestHeaders.Keys)

{

request.Headers.Add(key, requestHeaders[key]);

}

requestHeaders.Clear();

return request;

}

private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)

{

return true;

}

///

/// 将Cookie保存到磁盘

///

private static void SaveCookiesToDisk()

{

string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\webclient.cookie";

FileStream fs = null;

try

{

fs = new FileStream(cookieFile, FileMode.Create);

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

formater.Serialize(fs, cc);

}

finally

{

if (fs != null) fs.Close();

}

}

///

/// 从磁盘加载Cookie

///

private static void LoadCookiesFromDisk()

{

cc = new CookieContainer();

string cookieFile = System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies) + "\\webclient.cookie";

if (!File.Exists(cookieFile))

return;

FileStream fs = null;

try

{

fs = new FileStream(cookieFile, FileMode.Open, FileAccess.Read, FileShare.Read);

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formater = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

cc = (CookieContainer)formater.Deserialize(fs);

}

finally

{

if (fs != null) fs.Close();

}

}

}

///

/// 对文件和文本数据进行Multipart形式的编码

///

public class MultipartForm

{

private Encoding encoding;

private MemoryStream ms;

private string boundary;

private byte[] formData;

///

/// 获取编码后的字节数组

///

public byte[] FormData

{

get

{

if (formData == null)

{

byte[] buffer = encoding.GetBytes("--" + this.boundary + "--\r\n");

ms.Write(buffer, 0, buffer.Length);

formData = ms.ToArray();

}

return formData;

}

}

///

/// 获取此编码内容的类型

///

public string ContentType

{

get { return string.Format("multipart/form-data; boundary={0}", this.boundary); }

}

///

/// 获取或设置对字符串采用的编码类型

///

public Encoding StringEncoding

{

set { encoding = value; }

get { return encoding; }

}

///

/// 实例化

///

public MultipartForm()

{

boundary = string.Format("--{0}--", Guid.NewGuid());

ms = new MemoryStream();

encoding = Encoding.Default;

}

///

/// 添加一个文件

///

/// 文件域名称

/// 文件的完整路径

public void AddFlie(string name, string filename)

{

if (!File.Exists(filename))

throw new FileNotFoundException("尝试添加不存在的文件。", filename);

FileStream fs = null;

byte[] fileData ={ };

try

{

fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

fileData = new byte[fs.Length];

fs.Read(fileData, 0, fileData.Length);

this.AddFlie(name, Path.GetFileName(filename), fileData, fileData.Length);

}

catch (Exception)

{

throw;

}

finally

{

if (fs != null) fs.Close();

}

}

///

/// 添加一个文件

///

/// 文件域名称

/// 文件名

/// 文件二进制数据

/// 二进制数据大小

public void AddFlie(string name, string filename, byte[] fileData, int dataLength)

{

if (dataLength <= 0 || dataLength > fileData.Length)

{

dataLength = fileData.Length;

}

StringBuilder sb = new StringBuilder();

sb.AppendFormat("--{0}\r\n", this.boundary);

sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\n", name, filename);

sb.AppendFormat("Content-Type: {0}\r\n", this.GetContentType(filename));

sb.Append("\r\n");

byte[] buf = encoding.GetBytes(sb.ToString());

ms.Write(buf, 0, buf.Length);

ms.Write(fileData, 0, dataLength);

byte[] crlf = encoding.GetBytes("\r\n");

ms.Write(crlf, 0, crlf.Length);

}

///

/// 添加字符串

///

/// 文本域名称

/// 文本值

public void AddString(string name, string value)

{

StringBuilder sb = new StringBuilder();

sb.AppendFormat("--{0}\r\n", this.boundary);

sb.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n", name);

sb.Append("\r\n");

sb.AppendFormat("{0}\r\n", value);

byte[] buf = encoding.GetBytes(sb.ToString());

ms.Write(buf, 0, buf.Length);

}

///

/// 从注册表获取文件类型

///

/// 包含扩展名的文件名

/// 如:application/stream

private string GetContentType(string filename)

{

Microsoft.Win32.RegistryKey fileExtKey = null; ;

string contentType = "application/stream";

try

{

fileExtKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(Path.GetExtension(filename));

contentType = fileExtKey.GetValue("Content Type", contentType).ToString();

}

finally

{

if (fileExtKey != null) fileExtKey.Close();

}

return contentType;

}

}

}

使用实例:

class Test

{

public static void Test1()

{

HttpProc.WebClient c = new HttpProc.WebClient();

c.DownloadProgressChanged += new EventHandler(c_DownloadProgressChanged);

c.UploadProgressChanged += new EventHandler(c_UploadProgressChanged);

//登录百度空间

c.Post("https://passport.baidu.com/?login", "username=hddo&password=**********");

if (c.RespHtml.Contains("passport.baidu.com"))

{

//登录成功

}

//向百度相册上传图片

HttpProc.MultipartForm mf = new HttpProc.MultipartForm();

mf.AddString("BrowserType", "1");

mf.AddString("spPhotoText0", "10086");

mf.AddString("spAlbumName", "默认相册");

mf.AddString("spMaxSize", "1600");

mf.AddString("spQuality", "90");

mf.AddFlie("file1", "D:\\Blue hills2.jpg");

c.Post("http://hiup.baidu.com/hddo/upload", mf);

if (c.RespHtml.Contains("submit(0,0)"))

{

//上传图片成功

}

}

static void c_UploadProgressChanged(object sender, HttpProc.UploadEventArgs e)

{

//显示上传进度

}

static void c_DownloadProgressChanged(object sender, HttpProc.DownloadEventArgs e)

{

//显示下载进度

}

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约