t

using ZhiHe.Entity.Corpize;
using System;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using ZhiHe.Entity.BaiDu;
using ZhiHe.Utils;

namespace ZhiHe.Common
{
    public static class HtmlHelper
    {
        private static readonly TimeSpan requestTimeout = new TimeSpan(0, 0, 20);

        #region HttpClient 实现

        #region get

        /// <summary>
        /// get 常规
        /// </summary>
        public static async ValueTask<string> GetHtmlAsync(HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                var request = new HttpRequestMessage(HttpMethod.Get, string.Empty);
                client.Timeout = requestTimeout;
                var response = await client.SendAsync(request);
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// get 带url,超时
        /// </summary>
        public static async ValueTask<string> GetHtmlAsync(string url, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                var request = new HttpRequestMessage(HttpMethod.Get, url);
                client.Timeout = timeout;
                var response = await client.SendAsync(request);
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// get 带url,ua,超时
        /// </summary>
        public static async ValueTask<string> GetHtmlAsync(string url, string ua, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                var request = new HttpRequestMessage(HttpMethod.Get, url);
                client.Timeout = timeout;
                request.Headers.Add("User-Agent", ua);
                var response = await client.SendAsync(request);
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }
        #endregion

        #region post

        /// <summary>
        /// post
        /// </summary>
        public static async ValueTask<string> PostHtmlAsync(string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;

                var response = await client.PostAsync(string.Empty, new StringContent(strPostData));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post 带url
        /// </summary>
        public static async ValueTask<string> PostHtmlAsync(string url, string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(url, new StringContent(strPostData));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post 带ua
        /// </summary>
        public static async ValueTask<string> PostHtmlUaAsync(string ua, string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                client.DefaultRequestHeaders.Add("User-Agent", ua);
                var response = await client.PostAsync(string.Empty, new StringContent(strPostData));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post 百度
        /// </summary>
        public static async ValueTask<MobadsResponse> PostHtmlByBaiDuAsync(byte[] buffer, TimeSpan timeout, HttpClient client)
        {
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(string.Empty, new ByteArrayContent(buffer));

                return ProtoBuf.Serializer.Deserialize<MobadsResponse>(await response.Content.ReadAsStreamAsync());
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// post connettype为application/json
        /// </summary>
        public static async ValueTask<string> PostHtmlContentTypeJsonAsync(string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(string.Empty, new StringContent(strPostData, Encoding.UTF8, "application/json"));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post connettype为text/plain
        /// </summary>
        public static async ValueTask<string> PostHtmlContentTypeTextAsync(string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(string.Empty, new StringContent(strPostData, Encoding.UTF8, "text/plain"));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// 玩咖专用请求方法
        /// </summary>
        public static async ValueTask<string> PostHtmlWanKaAsync(string ua, string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                client.DefaultRequestHeaders.Add("User-Agent", ua);
                HttpContent content = new ByteArrayContent(Tool.GzipCompress(Encoding.UTF8.GetBytes(strPostData)));
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json")
                {
                    CharSet = "utf-8"
                };
                var response = await client.PostAsync(string.Empty, content);
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post 极光
        /// </summary>
        public static async ValueTask<AdResponse> PostHtmlByJiGuangAsync(byte[] buffer, TimeSpan timeout, HttpClient client)
        {
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(string.Empty, new ByteArrayContent(buffer));

                return ProtoBuf.Serializer.Deserialize<AdResponse>(await response.Content.ReadAsStreamAsync());
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 京东专用
        /// </summary>
        public static async ValueTask<Entity.Request.JingDongYingXiao.BidResponse> PostHtmlByJingDongAsync(byte[] buffer, TimeSpan timeout, HttpClient client)
        {
            try
            {
                client.Timeout = timeout;
                HttpContent content = new ByteArrayContent(buffer);
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                var response = await client.PostAsync(string.Empty, content);
                return ProtoBuf.Serializer.Deserialize<Entity.Request.JingDongYingXiao.BidResponse>(await response.Content.ReadAsStreamAsync());
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// application/json且不包含charset=utf-8
        /// </summary>
        public static async ValueTask<string> PostHtmlContentTypeJsonNoCharsetAsync(string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                HttpContent content = new StringContent(strPostData);
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(string.Empty, content);
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        public static async ValueTask<string> PostHtmlContentTypeFormAsync(string strPostData, TimeSpan timeout, HttpClient client)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                var response = await client.PostAsync(string.Empty, new StringContent(strPostData, Encoding.UTF8, "application/x-www-form-urlencoded"));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }

        /// <summary>
        /// post 带X-CAD-S2S-SIGNITURE  ---省广畅思API接口专用
        /// </summary>
        /// <param name="strPostData"></param>
        /// <param name="timeout"></param>
        /// <param name="client"></param>
        /// <param name="signiture"></param>
        /// <returns></returns>
        public static async ValueTask<string> PostHtmlSignitureAsync(string strPostData, TimeSpan timeout, HttpClient client, string signiture)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                client.DefaultRequestHeaders.Add("X-CAD-S2S-SIGNITURE", signiture);
                var response = await client.PostAsync(string.Empty, new StringContent(strPostData));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }


        public static async ValueTask<string> PostHtmlAsyncBoBoMaterial(string url, string strPostData, TimeSpan timeout, HttpClient client, string dspId, string timeSpan, string token)
        {
            string strWebData = string.Empty;
            try
            {
                client.Timeout = timeout;
                client.DefaultRequestHeaders.Add("dsp_id", dspId);
                client.DefaultRequestHeaders.Add("timestamp", timeSpan);
                client.DefaultRequestHeaders.Add("token", token);
                var response = await client.PostAsync(url, new StringContent(strPostData));
                if (response.Content.Headers.ContentEncoding == null || response.Content.Headers.ContentEncoding.Count == 0)
                    strWebData = await response.Content.ReadAsStringAsync();
                else
                {
                    if (response.Content.Headers.ContentEncoding.Contains("gzip"))
                    {
                        using (StreamReader reader = new StreamReader(new GZipStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else if (response.Content.Headers.ContentEncoding.Contains("deflate"))
                    {
                        using (StreamReader reader = new StreamReader(new DeflateStream(await response.Content.ReadAsStreamAsync(), CompressionMode.Decompress), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();

                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
        }
        #endregion

        #endregion

        #region HttpWebRequest 实现, core环境下高并发端口占用太多,导致503错误

        #region Get
        public static async ValueTask<string> GetHtmlIsGzip(string url)
        {
            HttpWebRequest wReq = null;
            string strWebData = string.Empty;
            try
            {
                wReq = (HttpWebRequest)WebRequest.Create(@url);
                wReq.Proxy = null;
                wReq.Accept = "*/*";
                wReq.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";
                wReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
                wReq.Headers.Add("Accept-Encoding", "gzip,deflate");
                wReq.Method = "GET";
                wReq.Timeout = 120000;
                wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                wReq.KeepAlive = false;
                wReq.AllowWriteStreamBuffering = false;
                using (HttpWebResponse wResp = (HttpWebResponse)await wReq.GetResponseAsync())
                {
                    if (string.IsNullOrWhiteSpace(wResp.ContentEncoding))
                    {
                        using (StreamReader reader = new StreamReader(wResp.GetResponseStream(), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else
                    {
                        if (wResp.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new GZipStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                        else if (wResp.ContentEncoding.Equals("deflate", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new DeflateStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();

                        }
                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }

        public static async ValueTask<string> GetHtmlIsGzip(string url, string ua)
        {
            HttpWebRequest wReq = null;
            string strWebData = string.Empty;
            try
            {
                wReq = (HttpWebRequest)WebRequest.Create(@url);
                wReq.Proxy = null;
                wReq.Accept = "*/*";
                wReq.UserAgent = ua;
                wReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
                wReq.Headers.Add("Accept-Encoding", "gzip,deflate");
                wReq.Method = "GET";
                wReq.Timeout = 120000;
                wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                wReq.KeepAlive = false;
                wReq.AllowWriteStreamBuffering = false;
                using (HttpWebResponse wResp = (HttpWebResponse)await wReq.GetResponseAsync())
                {
                    if (string.IsNullOrWhiteSpace(wResp.ContentEncoding))
                    {
                        using (StreamReader reader = new StreamReader(wResp.GetResponseStream(), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else
                    {
                        if (wResp.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new GZipStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                        else if (wResp.ContentEncoding.Equals("deflate", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new DeflateStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();

                        }
                    }
                }
                return strWebData;
            }
            catch
            {
                return strWebData;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }

        #endregion

        #region Post
        public static async ValueTask<string> PostHtmlIsGzip(string url, string strPostdata)
        {
            HttpWebRequest wReq = null;
            try
            {
                string strWebData = string.Empty;
                wReq = (HttpWebRequest)WebRequest.Create(@url);
                wReq.Proxy = null;
                wReq.ContentType = "application/json";
                wReq.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
                wReq.Headers.Add("Accept-Encoding", "gzip,deflate");
                wReq.ServicePoint.Expect100Continue = false;
                wReq.ServicePoint.UseNagleAlgorithm = false;
                wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                wReq.AllowWriteStreamBuffering = false;
                wReq.Method = "POST";
                wReq.Timeout = 50000;
                wReq.KeepAlive = false;
                byte[] buffer = Encoding.UTF8.GetBytes(strPostdata);
                wReq.ContentLength = buffer.Length;
                wReq.GetRequestStream().Write(buffer, 0, buffer.Length);
                using (HttpWebResponse wResp = (HttpWebResponse)await wReq.GetResponseAsync())
                {
                    if (string.IsNullOrWhiteSpace(wResp.ContentEncoding))
                    {
                        using (StreamReader reader = new StreamReader(wResp.GetResponseStream(), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else
                    {
                        if (wResp.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new GZipStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                        else if (wResp.ContentEncoding.Equals("deflate", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new DeflateStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                    }
                }
                return strWebData;
            }
            catch (Exception ex)
            {
                Log.SaveLog("PostHtmlIsGzip", ex.Message + ex.Source + url + strPostdata);
                return null;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }

        public static async ValueTask<string> PostHtmlIsGzipByStatusCode(string url, string strPostdata)
        {
            HttpWebRequest wReq = null;
            try
            {
                string strWebData = string.Empty;
                wReq = (HttpWebRequest)WebRequest.Create(@url);
                wReq.Proxy = null;
                wReq.ContentType = "application/json";
                wReq.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
                wReq.Headers.Add("Accept-Encoding", "gzip,deflate");
                wReq.ServicePoint.Expect100Continue = false;
                wReq.ServicePoint.UseNagleAlgorithm = false;
                wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                wReq.AllowWriteStreamBuffering = false;
                wReq.Method = "POST";
                wReq.Timeout = 50000;
                wReq.KeepAlive = false;
                byte[] buffer = Encoding.UTF8.GetBytes(strPostdata);
                wReq.ContentLength = buffer.Length;
                wReq.GetRequestStream().Write(buffer, 0, buffer.Length);
                using (HttpWebResponse wResp = (HttpWebResponse)await wReq.GetResponseAsync())
                {
                    if (string.IsNullOrWhiteSpace(wResp.ContentEncoding))
                    {
                        using (StreamReader reader = new StreamReader(wResp.GetResponseStream(), Encoding.UTF8))
                            strWebData = await reader.ReadToEndAsync();
                    }
                    else
                    {
                        if (wResp.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new GZipStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                        else if (wResp.ContentEncoding.Equals("deflate", StringComparison.InvariantCultureIgnoreCase))
                        {
                            using (StreamReader reader = new StreamReader(new DeflateStream(wResp.GetResponseStream(), CompressionMode.Decompress), Encoding.UTF8))
                                strWebData = await reader.ReadToEndAsync();
                        }
                    }
                }
                return strWebData;
            }
            catch (WebException ex)
            {
                if (((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.BadRequest)
                    Log.SaveLog("PostHtmlIsGzip", ex.Message + ex.Source + url + strPostdata);
                return null;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }

        public static async ValueTask<MobadsResponse> PostHtmlByBaiDu(string url, byte[] buffer)
        {
            HttpWebRequest wReq = null;
            try
            {
                MobadsResponse strWebData = null;
                wReq = (HttpWebRequest)WebRequest.Create(@url);
                wReq.Proxy = null;
                wReq.ContentType = "x-protobuf";
                wReq.Connection = "KeepAlive";
                wReq.ServicePoint.Expect100Continue = false;
                wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                wReq.AllowWriteStreamBuffering = false;
                wReq.Method = "POST";
                wReq.Timeout = 200000;
                wReq.ContentLength = buffer.Length;
                wReq.GetRequestStream().Write(buffer, 0, buffer.Length);


                using (HttpWebResponse wResp = (HttpWebResponse)await wReq.GetResponseAsync())
                {
                    strWebData = ProtoBuf.Serializer.Deserialize<MobadsResponse>(wResp.GetResponseStream());
                }
                return strWebData;
            }
            catch
            {
                return null;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }

        public static async Task<Entity.Corpize.BidResponse> PostHtmlByCorpize(string url, byte[] buffer)
        {
            HttpWebRequest wReq = null;
            try
            {
                HttpClient client = new HttpClient();
                Entity.Corpize.BidResponse strWebData = null;
                HttpContent content = new ByteArrayContent(buffer);
                client.BaseAddress = new Uri(url);
                client.DefaultRequestHeaders.Add("ContentType", "application/octet-stream");
                client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip,deflate");
                client.DefaultRequestHeaders.Add("User-Agent", "ZhiHe");
                client.DefaultRequestHeaders.Connection.Add("keep-alive");
                client.Timeout = new TimeSpan(0, 0, 20);
                var response = await client.PostAsync(string.Empty, content);

                return ProtoBuf.Serializer.Deserialize<Entity.Corpize.BidResponse>(await response.Content.ReadAsStreamAsync());
                //wReq = (HttpWebRequest)WebRequest.Create(@url);
                //wReq.Proxy = null;
                ////wReq.Accept = "application/x-protobuf";
                //wReq.ContentType = "application/octet-stream";
                //wReq.Connection = "KeepAlive";
                //wReq.ServicePoint.Expect100Continue = false;
                //wReq.ServicePoint.ConnectionLimit = int.MaxValue;
                //wReq.AllowWriteStreamBuffering = false;
                //wReq.Method = "POST";
                //wReq.Timeout = 120000;
                //wReq.ContentLength = buffer.Length;
                //wReq.GetRequestStream().Write(buffer, 0, buffer.Length);
                //using (HttpWebResponse wResp = (HttpWebResponse)wReq.GetResponse())
                //{
                //    strWebData = ProtoBuf.Serializer.Deserialize<Corpize.BidResponse>(wResp.GetResponseStream());
                //}
                return strWebData;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                if (wReq != null)
                    wReq.Abort();
            }
        }
        #endregion

        #endregion
    }
}

原文地址:https://www.cnblogs.com/mrray/p/10712287.html