http请求帮助类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Collections;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace api.HttpHelp
{
public class HttpClientHelp
{
public List<string> ExtraHeadList { get; set; }
public Dictionary<string, string> FixedHeadList { get; set; }
public string VirtualIp { get; set; }
public WebProxy Proxy { get; set; }
public bool KeepAlive { get; set; }
public Encoding Encoding { get; set; }
public bool AllowAutoRedirect { get; set; }
public string Authorization { get; set; }
public int Timeout { get; set; }
public string UserAgent { get; set; }
public string ContentType { get; set; }
public string Accept { get; set; }
public string Referer { get; set; }
public string Url { get; set; }
public string LocationUrl => ResponseHeaders != null ? ResponseHeaders["Location"] : "";
public string WebExceptionResponse { get; private set; }
public WebHeaderCollection ResponseHeaders { get; private set; }
public CookieContainer CookieContainer { get; set; }
public HttpClientHelp()
{
Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
KeepAlive = true;
CookieContainer = null;
Timeout = 15 * 1000;
AllowAutoRedirect = true;
Encoding = Encoding.UTF8;
ExtraHeadList = new List<string>();
FixedHeadList = new Dictionary<string, string>();
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
static HttpClientHelp()
{
ServicePointManager.DefaultConnectionLimit = 512;
}
public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
public string GetHost(string url)
{
return new Uri(url).Host;
}
string GetResponseBody(HttpWebResponse response)
{
if (response == null)
{
return string.Empty;
}
using (var stream = GetResponseStream(response))
{
var responseBody = "";
using (var reader = new StreamReader(stream, Encoding))
{
ResponseHeaders = response.Headers;
responseBody = reader.ReadToEnd();
}
return responseBody;
}
}
public string Get()
{
WebExceptionResponse = "";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.AllowAutoRedirect = AllowAutoRedirect;
request.Method = "GET";
request.Accept = Accept;
request.Referer = Referer;
request.UserAgent = UserAgent;
request.ContentType = ContentType;
request.KeepAlive = KeepAlive;
request.Proxy = Proxy;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
ResponseHeaders = null;
ExtraHeadList.ForEach(p => request.Headers.Add(p));
foreach (var item in FixedHeadList)
{
request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
}
if (!string.IsNullOrEmpty(VirtualIp))
{
request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
request.Headers.Add("VIA", VirtualIp);
request.Headers.Add("REMOTE_ADDR", VirtualIp);
request.Headers.Add("CLIENT_IP", VirtualIp);
}
if (!string.IsNullOrEmpty(Authorization))
{
request.Headers.Add("Authorization", Authorization);
}
if (CookieContainer != null)
{
request.CookieContainer = CookieContainer;
}
try
{
var response = (HttpWebResponse)request.GetResponse();
request.ContentType = "";
return GetResponseBody(response);
}
catch (WebException ex)
{
WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
throw ex;
}
}
public string Get_AllowAutoRedirect()
{
WebExceptionResponse = "";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.AllowAutoRedirect = false;
request.Method = "GET";
request.Accept = Accept;
request.Referer = Referer;
request.UserAgent = UserAgent;
request.ContentType = ContentType;
request.KeepAlive = KeepAlive;
request.Proxy = Proxy;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
ResponseHeaders = null;
ExtraHeadList.ForEach(p => request.Headers.Add(p));
foreach (var item in FixedHeadList)
{
request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
}
if (!string.IsNullOrEmpty(VirtualIp))
{
request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
request.Headers.Add("VIA", VirtualIp);
request.Headers.Add("REMOTE_ADDR", VirtualIp);
request.Headers.Add("CLIENT_IP", VirtualIp);
}
if (!string.IsNullOrEmpty(Authorization))
{
request.Headers.Add("Authorization", Authorization);
}
if (CookieContainer != null)
{
request.CookieContainer = CookieContainer;
}
try
{
var response = (HttpWebResponse)request.GetResponse();
request.ContentType = "";
return GetResponseBody(response);
}
catch (WebException ex)
{
WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
throw ex;
}
}
public Task<byte[]> DownloadAsync()
{
return Task.Run(() => Download());
}
public byte[] Download()
{
var stream = DownloadToStream();
using (var ms = new MemoryStream())
{
stream.CopyTo(ms);
stream.Dispose();
return ms.GetBuffer();
}
}
public Stream DownloadToStream()
{
WebExceptionResponse = "";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.AllowAutoRedirect = AllowAutoRedirect;
request.Method = "GET";
request.Accept = Accept;
request.Referer = Referer;
request.UserAgent = UserAgent;
request.ContentType = ContentType;
request.KeepAlive = KeepAlive;
request.Proxy = Proxy;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
ResponseHeaders = null;
ExtraHeadList.ForEach(p => request.Headers.Add(p));
foreach (var item in FixedHeadList)
{
request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
}
if (!string.IsNullOrEmpty(VirtualIp))
{
request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
request.Headers.Add("VIA", VirtualIp);
request.Headers.Add("REMOTE_ADDR", VirtualIp);
request.Headers.Add("CLIENT_IP", VirtualIp);
}
if (!string.IsNullOrEmpty(Authorization))
{
request.Headers.Add("Authorization", Authorization);
}
if (CookieContainer != null)
{
request.CookieContainer = CookieContainer;
}
try
{
return GetResponseStream((HttpWebResponse)request.GetResponse());
}
catch (WebException ex)
{
WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
throw ex;
}
}
Stream GetResponseStream(HttpWebResponse response)
{
var contentEncoding = string.IsNullOrEmpty(response.ContentEncoding) ? "" : response.ContentEncoding.ToLower();
Stream stream = null;
if (contentEncoding == "")
{
stream = response.GetResponseStream();
}
else if (contentEncoding.Contains("gzip"))
{
stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
}
else if (contentEncoding.Contains("deflate"))
{
stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress);
}
else
{
stream = response.GetResponseStream();
}
return stream;
}
public Task<string> PostAsync(string content)
{
return Task.Run(() => Post(content));
}
public string Post(string content)
{
ServicePointManager.Expect100Continue = false;
WebExceptionResponse = "";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.AllowAutoRedirect = AllowAutoRedirect;
request.Method = "POST";
request.Accept = Accept;
request.Referer = Referer;
request.UserAgent = UserAgent;
request.KeepAlive = KeepAlive;
request.Proxy = Proxy;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
if (ContentType == null)
{
ContentType = "application/x-www-form-urlencoded";
}
request.ContentType = ContentType;
ResponseHeaders = null;
ExtraHeadList.ForEach(p => request.Headers.Add(p));
foreach (var item in FixedHeadList)
{
request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
}
if (!string.IsNullOrEmpty(VirtualIp))
{
request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
request.Headers.Add("VIA", VirtualIp);
request.Headers.Add("REMOTE_ADDR", VirtualIp);
request.Headers.Add("CLIENT_IP", VirtualIp);
}
if (!string.IsNullOrEmpty(Authorization))
{
request.Headers.Add("Authorization", Authorization);
}
if (CookieContainer != null)
{
request.CookieContainer = CookieContainer;
}
var buffer = Encoding.GetBytes(content);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
try
{
var response = (HttpWebResponse)request.GetResponse();
request.ContentType = "";
return GetResponseBody(response);
}
catch (WebException ex)
{
WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
throw;
}
}
public string PostLogin(string content)
{
ServicePointManager.Expect100Continue = false;
WebExceptionResponse = "";
var request = (HttpWebRequest)WebRequest.Create(Url);
request.AllowAutoRedirect = false;
request.Method = "POST";
request.Accept = Accept;
request.Referer = Referer;
request.UserAgent = UserAgent;
request.KeepAlive = KeepAlive;
request.Proxy = Proxy;
request.Timeout = 15 * 1000;
request.ReadWriteTimeout = Timeout;
if (ContentType == null)
{
ContentType = "application/x-www-form-urlencoded";
}
request.ContentType = ContentType;
ResponseHeaders = null;
ExtraHeadList.ForEach(p => request.Headers.Add(p));
foreach (var item in FixedHeadList)
{
request.Headers.Add($"{item.Key.Trim()}:{item.Value.Trim()}");
}
if (!string.IsNullOrEmpty(VirtualIp))
{
request.Headers.Add("X-FORWARDED-FOR", VirtualIp);
request.Headers.Add("VIA", VirtualIp);
request.Headers.Add("REMOTE_ADDR", VirtualIp);
request.Headers.Add("CLIENT_IP", VirtualIp);
}
if (!string.IsNullOrEmpty(Authorization))
{
request.Headers.Add("Authorization", Authorization);
}
if (CookieContainer != null)
{
request.CookieContainer = CookieContainer;
}
var buffer = Encoding.GetBytes(content);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
try
{
var response = (HttpWebResponse)request.GetResponse();
string LocationUrl = response.Headers["Location"];
return GetResponseBody(response);
}
catch (WebException ex)
{
WebExceptionResponse = GetResponseBody((HttpWebResponse)ex.Response);
throw ex;
}
}
public void GetAllCookies(CookieContainer cc)
{
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
StringBuilder sb = new StringBuilder();
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c in colCookies)
{
Console.WriteLine(c.Domain + ":" + c.Name + "____" + c.Value + "\r\n");
}
}
}
}
}