码迷,mamicode.com
首页 > Web开发 > 详细

HttpRequest重写,解决资源战胜/链接超时/分块下载事件通知 问题。

时间:2015-06-18 13:20:53      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace MyApi
{
    public class HttpRequest
    {
        public HttpRequest()
        {
            //string Url = "http://localhost:5192/api/Cab/5";
            //string httpMethod = "PUT";
            //string httpContent = "{‘Name‘: ‘B90‘, ‘Color‘: ‘Green‘, ‘Height‘: 1590, ‘Width‘: 4500 }";
            //Encoding httpCode = Encoding.Default;
            //Console.WriteLine(Get(Url, httpMethod, httpContent, httpCode));

            setEncoding = Encoding.Default;
        }

        public HttpRequest(string url, string method) : base()
        {
            setUrl = url;
            setMethod = method;
        }

        /// <summary>
        /// 服务请求地址 http://www.aaa.com/
        /// </summary>
        public string setUrl { get; set; }
        /// <summary>
        /// 服务请求方法:GET/POST/PUT/DELETE
        /// </summary>
        public string setMethod { get; set; }

        /// <summary>
        /// 设置服务请求数据类型
        /// </summary>
        [DefaultValue("text/html")]
        public string setContentType { get; set; }

        /// <summary>
        /// 设置服务页面编码
        /// </summary>
        public Encoding setEncoding { get; set; }

        public delegate void DownloadStartDelegate(int httpStatusCode);
        public delegate void DownloadProcessDelegate(long totalLength, long DownloadedByte, float percent);
        public delegate void DownloadEndDelegate(long totalLength);

        public event DownloadStartDelegate DownloadStart;
        public event DownloadProcessDelegate DownloadProcess;
        public event DownloadEndDelegate DownloadEnd;

        public string Get()
        {
            return Get(setUrl);
        }

        public string Get(string setUrl)
        {
            return Get(setUrl, "GET", null, setEncoding);
        }

        public string Get(string setUrl, string httpContent)
        {
            return Get(setUrl, "POSE", httpContent, setEncoding);
        }

        public string Get(string Url, string httpMethod, string httpContent, Encoding httpCode)
        {
            if (string.IsNullOrWhiteSpace(Url) || string.IsNullOrWhiteSpace(httpMethod))
            {
                throw new ArgumentException("Url or HttpMethod 参数不能为空!");
            }

            GC.Collect();
            StringBuilder content = new StringBuilder();
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            StreamWriter sw = null;
            try
            {
                ServicePointManager.DefaultConnectionLimit = 512;
                request = WebRequest.Create(Url) as HttpWebRequest;
                request.Method = httpMethod;
                request.AllowAutoRedirect = true;
                request.KeepAlive = false;
                request.Accept = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)";
                request.ContentType = setContentType; //"application/octet-stream";
                request.Proxy = null;

                if (httpContent != null && !string.IsNullOrWhiteSpace(httpContent))
                {
                    using (sw = new StreamWriter(request.GetRequestStream()))
                    {
                        sw.Write(httpContent);
                    }
                }

                using (response = request.GetResponse() as HttpWebResponse)
                {
                    if (this.DownloadStart != null)
                        this.DownloadStart((int)response.StatusCode);

                    Stream stream = response.GetResponseStream();
                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                        stream = new GZipStream(stream, CompressionMode.Decompress);

                    float percent = 0;
                    long totalDownloadedByte = 0;
                    long totalBytes = response.ContentLength;
                    while (stream.CanRead)
                    {
                        byte[] buffer = new byte[1024];
                        int canrds = stream.Read(buffer, 0, 1024);
                        totalDownloadedByte = canrds + totalDownloadedByte;
                        percent = (float)totalDownloadedByte / (float)totalBytes * 100;

                        if (DownloadProcess != null)
                            DownloadProcess(totalBytes, totalDownloadedByte, percent);

                        if (canrds == 0) 
                            break;

                        content.Append(httpCode.GetString(buffer));
                    }
                    if (DownloadEnd != null)
                        DownloadEnd(totalBytes);
                    stream.Dispose();
                }
            }
            finally
            {
                if(request != null) request.Abort();
                if(response != null) response.Dispose();
                if(sw != null) sw.Dispose();
            }
            GC.SuppressFinalize(this);
            return content.ToString();

            /*
            Response.Write(Guid.NewGuid().ToString() + "<hr />");
            Response.Write(Guid.NewGuid().ToString("N") + "<hr />");

            Response.Write(GetHttpContent);
            Response.End();
            */
        }

    }
}

 

HttpRequest重写,解决资源战胜/链接超时/分块下载事件通知 问题。

标签:

原文地址:http://www.cnblogs.com/S.Sams/p/webrequest.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!