你的位置:首页 > ASP.net教程

[ASP.net教程]HttpRequest重写,解决资源战胜/链接超时/分块下载事件通知 问题。


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();      */    }  }}