博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Http 数据操作
阅读量:5352 次
发布时间:2019-06-15

本文共 17039 字,大约阅读时间需要 56 分钟。

///         /// 上传数据参数        ///         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; } }
View Code

 

posted on
2017-11-24 16:22 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/qc-id-01/p/7891188.html

你可能感兴趣的文章
集合嵌套遍历的基本代码实现(针对存储于多个组中的元素)
查看>>
For macOS.百度网盘 破解SVIP、下载速度限制~
查看>>
IOS InHouse 发布流程
查看>>
BZOJ 4557 侦察守卫
查看>>
C99C新增内容
查看>>
<select>元素实现提示信息(类似于<input>元素的placeholder)
查看>>
基本数据类型(int, bool, str)
查看>>
python decorator模式
查看>>
python paramiko 远程下载
查看>>
C#如何安装Windows Service服务
查看>>
Entity Framework
查看>>
mysql数据库基本语句
查看>>
渐进式web应用开发---service worker (二)
查看>>
Linux内核分析第一周作业
查看>>
leecode刷题(12)-- 整数反转
查看>>
学习中印象最深的一个error
查看>>
聚石塔中查询数据库是否有锁
查看>>
eclipse创建android项目,无法正常预览布局文件的相关问题
查看>>
Moinmoin wiki 中文附件名的解决办法
查看>>
poj 2187 Beauty Contest
查看>>