C#、.NET网络请求总结

2020-12-13 16:04

阅读:582

标签:style   blog   http   io   color   ar   os   使用   for   

1、关于WebClient第三方的封装,支持多文件上传等

soscw.com,搜素材soscw.com,搜素材
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Net;  
using System.Net.Sockets;  
using System.Collections;  
using System.IO;  
using System.Text.RegularExpressions;  
using RE = System.Text.RegularExpressions.Regex;  
using System.Security.Cryptography.X509Certificates;  
 
/***************************************************************************************************************************************************  
 * *文件名:HttpProc.cs  
 * *创建人:kenter  
 * *日 期:2010.02.23 修改  
* *描 述:实现HTTP协议中的GET、POST请求  
* *使 用:HttpProc.WebClient client = new HttpProc.WebClient();  
 client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型  
client.OpenRead("http://www.baidu.com");//普通get请求  
MessageBox.Show(client.RespHtml);//获取返回的网页源代码  
client.DownloadFile("http://www.codepub.com/upload/163album.rar",@"C:\163album.rar");//下载文件  
client.OpenRead("http://passport.baidu.com/?login","username=zhangsan&password=123456");//提交表单,此处是登录百度的示例  
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", @"file1=D:\1.mp3");//上传文件  
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", "folder=myfolder&size=4003550",@"file1=D:\1.mp3");//提交含文本域和文件域的表单  
*****************************************************************************************************************************************************/

namespace HttpProc
{
    ///  
    ///上传事件委托  
    ///  
    ///  
    ///  
    public delegate void WebClientUploadEvent(object sender, HttpProc.UploadEventArgs e);

    ///  
    ///下载事件委托  
    ///  
    ///  
    ///  
    public delegate void WebClientDownloadEvent(object sender, HttpProc.DownloadEventArgs e);


    ///  
    ///上传事件参数  
    ///  
    public struct UploadEventArgs
    {
        ///  
        ///上传数据总大小  
        ///  
        public long totalBytes;
        ///  
        ///已发数据大小  
        ///  
        public long bytesSent;
        ///  
        ///发送进度(0-1)  
        ///  
        public double sendProgress;
        ///  
        ///发送速度Bytes/s  
        ///  
        public double sendSpeed;
    }

    ///  
    ///下载事件参数  
    ///  
    public struct DownloadEventArgs
    {
        ///  
        ///下载数据总大小  
        ///  
        public long totalBytes;
        ///  
        ///已接收数据大小  
        ///  
        public long bytesReceived;
        ///  
        ///接收数据进度(0-1)  
        ///  
        public double ReceiveProgress;
        ///  
        ///当前缓冲区数据  
        ///  
        public byte[] receivedBuffer;
        ///  
        ///接收速度Bytes/s  
        ///  
        public double receiveSpeed;
    }

    ///  
    ///实现向WEB服务器发送和接收数据  
    ///  
    public class WebClient
    {
        private WebHeaderCollection requestHeaders, responseHeaders;
        private TcpClient clientSocket;
        private MemoryStream postStream;
        private Encoding encoding = Encoding.Default;
        private const string BOUNDARY = "--HEDAODE--";
        private const int SEND_BUFFER_SIZE = 10245;
        private const int RECEIVE_BUFFER_SIZE = 10245;
        private string cookie = "";
        private string respHtml = "";
        private string strRequestHeaders = "";
        private string strResponseHeaders = "";
        private int statusCode = 0;
        private bool isCanceled = false;
        public event WebClientUploadEvent UploadProgressChanged;
        public event WebClientDownloadEvent DownloadProgressChanged;

        ///  
        ///初始化WebClient类  
        ///  
        public WebClient()
        {
            responseHeaders = new WebHeaderCollection();
            requestHeaders = new WebHeaderCollection();
        }

        ///   
        /// 获得字符串中开始和结束字符串中间得值  
        ///   
        ///   
        /// 开始  
        /// 结束  
        ///   
        public string gethtmlContent(string str, string s, string e)
        {
            Regex rg = new Regex("(?" + s + "))[.\\s\\S]*?(?=(" + e + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            return rg.Match(str).Value;
        }

        ///   
        /// 过滤HTML字符  
        ///   
        ///   
        ///   
        public string htmlConvert(string source)
        {
            string result;

            //remove line breaks,tabs  
            result = source.Replace("\r", " ");
            result = result.Replace("\n", " ");
            result = result.Replace("\t", " ");

            //remove the header  
            result = Regex.Replace(result, "().*()", string.Empty, RegexOptions.IgnoreCase);

            result = Regex.Replace(result, @"])*>", "", RegexOptions.IgnoreCase);
            result = Regex.Replace(result, @"()", string.Empty, RegexOptions.IgnoreCase);

            //remove all styles  
            result = Regex.Replace(result, @"])*>", "", RegexOptions.IgnoreCase); //clearing attributes  
            result = Regex.Replace(result, "()", string.Empty, RegexOptions.IgnoreCase);

            //insert tabs in spaces of  tags  
            result = Regex.Replace(result, @"])*>", " ", RegexOptions.IgnoreCase);

            //insert line breaks in places of 
and
  • tags
  • result = Regex.Replace(result, @"", "\r", RegexOptions.IgnoreCase); result = Regex.Replace(result, @"", "\r", RegexOptions.IgnoreCase); //insert line paragraphs in places of and

    tags result = Regex.Replace(result, @"])*>", "\r\r", RegexOptions.IgnoreCase); result = Regex.Replace(result, @"])*>", "\r\r", RegexOptions.IgnoreCase); //remove anything thats enclosed inside result = Regex.Replace(result, @"]*>", string.Empty, RegexOptions.IgnoreCase); //replace special characters: result = Regex.Replace(result, @"&", "&", RegexOptions.IgnoreCase); result = Regex.Replace(result, @" ", " ", RegexOptions.IgnoreCase); result = Regex.Replace(result, @"<", "", RegexOptions.IgnoreCase); result = Regex.Replace(result, @">", ">", RegexOptions.IgnoreCase); result = Regex.Replace(result, @"&(.{2,6});", string.Empty, RegexOptions.IgnoreCase); //remove extra line breaks and tabs result = Regex.Replace(result, @" ( )+", " "); result = Regex.Replace(result, "(\r)( )+(\r)", "\r\r"); result = Regex.Replace(result, @"(\r\r)+", "\r\n"); return result; } ///

    ///读取指定URL的文本 /// ///请求的地址 ///服务器响应文本 public string OpenRead(string URL) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); return GetHtml(); } //解决证书过期无法访问的问题 class CertPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvpt, X509Certificate cert, WebRequest req, int certprb) { return true; } } /// ///采用https协议访问网络 /// ///url地址 ///发送的数据 /// public string OpenReadWithHttps(string URL, string strPostdata) { ServicePointManager.CertificatePolicy = new CertPolicy(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.CookieContainer = new CookieContainer(); request.Method = "POST"; request.Accept = "*/*"; request.ContentType = "application/x-www-form-urlencoded"; byte[] buffer = this.encoding.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), encoding); this.respHtml = reader.ReadToEnd(); foreach (System.Net.Cookie ck in response.Cookies) { this.cookie += ck.Name + "=" + ck.Value + ";"; } reader.Close(); return respHtml; } /// ///读取指定URL的文本 /// ///请求的地址 ///向服务器发送的文本数据 ///服务器响应文本 public string OpenRead(string URL, string postData) { byte[] sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded"); requestHeaders.Add("Connection", "close"); SendRequestData(URL, "POST"); return GetHtml(); } /// ///读取指定URL的流 /// ///请求的地址 ///向服务器发送的数据 ///服务器响应流 public Stream GetStream(string URL, string postData) { byte[] sendBytes = encoding.GetBytes(postData); postStream = new MemoryStream(); postStream.Write(sendBytes, 0, sendBytes.Length); requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "application/x-www-form-urlencoded"); requestHeaders.Add("Connection", "close"); SendRequestData(URL, "POST"); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms); return ms; } /// ///上传文件到服务器 /// ///请求的地址 ///文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg) ///服务器响应文本 public string UploadFile(string URL, string fileField) { return UploadFile(URL, "", fileField); } /// ///上传文件和数据到服务器 /// ///请求地址 ///文本域(格式为:name1=value1&name2=value2) ///文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg) ///服务器响应文本 public string UploadFile(string URL, string textField, string fileField) { postStream = new MemoryStream(); if (textField != "" && fileField != "") { WriteTextField(textField); WriteFileField(fileField); } else if (fileField != "") { WriteFileField(fileField); } else if (textField != "") { WriteTextField(textField); } else throw new Exception("文本域和文件域不能同时为空。"); //写入结束标记 byte[] buffer = encoding.GetBytes("--" + BOUNDARY + "--\r\n"); postStream.Write(buffer, 0, buffer.Length); //添加请求标头 requestHeaders.Add("Content-Length", postStream.Length.ToString()); requestHeaders.Add("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); requestHeaders.Add("Connection", "Keep-Alive"); //发送请求数据 SendRequestData(URL, "POST", true); //返回响应文本 return GetHtml(); } /// ///分析文本域,添加到请求流 /// ///文本域 private void WriteTextField(string textField) { string[] strArr = RE.Split(textField, "&"); textField = ""; foreach (string var in strArr) { Match M = RE.Match(var, "([^=]+)=(.+)"); textField += "--" + BOUNDARY + "\r\n"; textField += "Content-Disposition: form-data; name=\"" + M.Groups[1].Value + "\"\r\n\r\n" + M.Groups[2].Value + "\r\n"; } byte[] buffer = encoding.GetBytes(textField); postStream.Write(buffer, 0, buffer.Length); } /// ///分析文件域,添加到请求流 /// ///文件域 private void WriteFileField(string fileField) { string filePath = ""; int count = 0; string[] strArr = RE.Split(fileField, "&"); foreach (string var in strArr) { Match M = RE.Match(var, "([^=]+)=(.+)"); filePath = M.Groups[2].Value; fileField = "--" + BOUNDARY + "\r\n"; fileField += "Content-Disposition: form-data; name=\"" + M.Groups[1].Value + "\"; filename=\"" + Path.GetFileName(filePath) + "\"\r\n"; fileField += "Content-Type: image/jpeg\r\n\r\n"; byte[] buffer = encoding.GetBytes(fileField); postStream.Write(buffer, 0, buffer.Length); //添加文件数据 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); buffer = new byte[50000]; do { count = fs.Read(buffer, 0, buffer.Length); postStream.Write(buffer, 0, count); } while (count > 0); fs.Close(); fs.Dispose(); fs = null; buffer = encoding.GetBytes("\r\n"); postStream.Write(buffer, 0, buffer.Length); } } /// ///从指定URL下载数据流 /// ///请求地址 ///数据流 public Stream DownloadData(string URL) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms, true); return ms; } /// ///从指定URL下载文件 /// ///文件URL地址 ///文件保存路径,含文件名(如:C:\test.jpg) public void DownloadFile(string URL, string fileName) { requestHeaders.Add("Connection", "close"); SendRequestData(URL, "GET"); FileStream fs = new FileStream(fileName, FileMode.Create); SaveNetworkStream(fs, true); fs.Close(); fs = null; } /// ///向服务器发送请求 /// ///请求地址 ///POST或GET ///是否显示上传进度 private void SendRequestData(string URL, string method, bool showProgress) { clientSocket = new TcpClient(); Uri URI = new Uri(URL); clientSocket.Connect(URI.Host, URI.Port); requestHeaders.Add("Host", URI.Host); byte[] request = GetRequestHeaders(method + " " + URI.PathAndQuery + " HTTP/1.1"); clientSocket.Client.Send(request); //若有实体内容就发送它 if (postStream != null) { byte[] buffer = new byte[SEND_BUFFER_SIZE]; int count = 0; Stream sm = clientSocket.GetStream(); postStream.Position = 0; UploadEventArgs e = new UploadEventArgs(); e.totalBytes = postStream.Length; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();//计时器 timer.Start(); do { //如果取消就推出 if (isCanceled) { break; } //读取要发送的数据 count = postStream.Read(buffer, 0, buffer.Length); //发送到服务器 sm.Write(buffer, 0, count); //是否显示进度 if (showProgress) { //触发事件 e.bytesSent += count; e.sendProgress = (double)e.bytesSent / (double)e.totalBytes; double t = timer.ElapsedMilliseconds / 1000; t = t 0 ? 1 : t; e.sendSpeed = (double)e.bytesSent / t; if (UploadProgressChanged != null) { UploadProgressChanged(this, e); } } } while (count > 0); timer.Stop(); postStream.Close(); //postStream.Dispose(); postStream = null; }//end if } /// ///向服务器发送请求 /// ///请求URL地址 ///POST或GET private void SendRequestData(string URL, string method) { SendRequestData(URL, method, false); } /// ///获取请求头字节数组 /// ///POST或GET请求 ///请求头字节数组 private byte[] GetRequestHeaders(string request) { requestHeaders.Add("Accept", "*/*"); requestHeaders.Add("Accept-Language", "zh-cn"); requestHeaders.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"); string headers = request + "\r\n"; foreach (string key in requestHeaders) { headers += key + ":" + requestHeaders[key] + "\r\n"; } //有Cookie就带上Cookie if (cookie != "") { headers += "Cookie:" + cookie + "\r\n"; } //空行,请求头结束 headers += "\r\n"; strRequestHeaders = headers; requestHeaders.Clear(); return encoding.GetBytes(headers); } /// ///获取服务器响应文本 /// ///服务器响应文本 private string GetHtml() { MemoryStream ms = new MemoryStream(); SaveNetworkStream(ms);//将网络流保存到内存流 StreamReader sr = new StreamReader(ms, encoding); respHtml = sr.ReadToEnd(); sr.Close(); ms.Close(); return respHtml; } /// ///将网络流保存到指定流 /// ///保存位置 ///是否显示进度 private void SaveNetworkStream(Stream toStream, bool showProgress) { //获取要保存的网络流 NetworkStream NetStream = clientSocket.GetStream(); byte[] buffer = new byte[RECEIVE_BUFFER_SIZE]; int count = 0, startIndex = 0; MemoryStream ms = new MemoryStream(); for (int i = 0; i 3; i++) { count = NetStream.Read(buffer, 0, 500); ms.Write(buffer, 0, count); } if (ms.Length == 0) { NetStream.Close(); throw new Exception("远程服务器没有响应"); } buffer = ms.GetBuffer(); count = (int)ms.Length; GetResponseHeader(buffer, out startIndex);//分析响应,获取响应头和响应实体 count -= startIndex; toStream.Write(buffer, startIndex, count); DownloadEventArgs e = new DownloadEventArgs(); if (responseHeaders["Content-Length"] != null) { e.totalBytes = long.Parse(responseHeaders["Content-Length"]); } else { e.totalBytes = -1; } //启动计时器 System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); do { //如果取消就推出 if (isCanceled) { break; } //显示下载进度 if (showProgress) { e.bytesReceived += count; e.ReceiveProgress = (double)e.bytesReceived / (double)e.totalBytes; byte[] tempBuffer = new byte[count]; Array.Copy(buffer, startIndex, tempBuffer, 0, count); e.receivedBuffer = tempBuffer; double t = (timer.ElapsedMilliseconds + 0.1) / 1000; e.receiveSpeed = (double)e.bytesReceived / t; startIndex = 0; if (DownloadProgressChanged != null) { DownloadProgressChanged(this, e); } } //读取网路数据到缓冲区 count = NetStream.Read(buffer, 0, buffer.Length); //将缓存区数据保存到指定流 toStream.Write(buffer, 0, count); } while (count > 0); timer.Stop();//关闭计时器 if (responseHeaders["Content-Length"] != null) { toStream.SetLength(long.Parse(responseHeaders["Content-Length"])); } //else //{ // toStream.SetLength(toStream.Length); // responseHeaders.Add("Content-Length", toStream.Length.ToString());//添加响应标头 //} toStream.Position = 0; //关闭网络流和网络连接 NetStream.Close(); clientSocket.Close(); } /// ///将网络流保存到指定流 /// ///保存位置 private void SaveNetworkStream(Stream toStream) { SaveNetworkStream(toStream, false); } /// ///分析响应流,去掉响应头 /// /// private void GetResponseHeader(byte[] buffer, out int startIndex) { responseHeaders.Clear(); string html = encoding.GetString(buffer); StringReader sr = new StringReader(html); int start = html.IndexOf("\r\n\r\n") + 4;//找到空行位置 strResponseHeaders = html.Substring(0, start);//获取响应头文本 //获取响应状态码 // if (sr.Peek() > -1) { //读第一行字符串 string line = sr.ReadLine(); //分析此行字符串,获取服务器响应状态码 Match M = RE.Match(line, @"\d\d\d"); if (M.Success) { statusCode = int.Parse(M.Value); } } //获取响应头 // while (sr.Peek() > -1) { //读一行字符串 string line = sr.ReadLine(); //若非空行 if (line != "") { //


    评论


    亲,登录后才可以留言!