MyWebClient.cs 6.6 KB
using log4net;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Security;
using System.Reflection;
using System.Text;

namespace OnlineStore.Common
{
    public class MyWebClient : WebClient
    {
        private int _timeout;

        /// <summary>
        /// 超时时间(毫秒)
        /// </summary>
        public int Timeout
        {
            get
            {
                return _timeout;
            }
            set
            {
                _timeout = value;
            }
        }

        public MyWebClient()
        {
            this._timeout = 60000;
        }

        public MyWebClient(int timeout)
        {
            this._timeout = timeout;
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest result =(HttpWebRequest) base.GetWebRequest(address);
            result.Timeout = this._timeout;
           // result.KeepAlive = false;
            result.ServicePoint.Expect100Continue = false;
            return result;
        }
    }
    public class HttpHelper
    {
        public static bool PingURLIP(string url, int ms = 100)
        {
            string[] urlArray = url.Split('/');
            if (urlArray.Length > 3)
            {
                string ip = urlArray[2];

                Ping pingSender = new Ping();
                PingReply reply = pingSender.Send(ip, ms);//第一个参数为ip地址,第二个参数为ping的时间 
                if (reply.Status == IPStatus.Success)
                {
                    //通
                    return true;
                }
                else
                {
                    LogUtil.error("Ping IP " + ip + " : false");
                    //不通 
                    return false;
                }
            }
            return true;
        }
        //public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        public static string Post(string url, string paramData, int timeOut = 5000)
        {
            bool IsTimeOut = false;
            return Post(url, paramData, Encoding.UTF8, timeOut,out IsTimeOut);
        }
        public static string Post(string url, string paramData, Encoding encoding, int timeOut, out bool IsTimeOut)
        {

            if (paramData.Equals(""))
            {
                int index = url.IndexOf("?");
                if (index > 0)
                {
                    paramData = url.Substring(index + 1, url.Length - index - 1);
                    url = url.Substring(0, index);
                }
            }

            IsTimeOut = false;
            string result = "";

            if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
            {
                ServicePointManager.ServerCertificateValidationCallback =
                               new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
            }

            try
            {
                using (var wc = new MyWebClient(timeOut))
                {
                    if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
                        wc.Headers.Add("Content-Type", "application/json;charset=UTF-8");//x-www-form-urlencoded
                    wc.Encoding = encoding;

                    result = wc.UploadString(url, "POST", paramData);
                }      //LogUtil.info(result);
            }
            catch (WebException ex)
            {
                IsTimeOut = true;
                LogUtil.error("POST [" + url + "] WebException :" + ex.ToString(), 101);
            }
            catch (Exception e)
            {
                LogUtil.error("POST [" + url + "] ERROR["+ paramData + "]:" + e.ToString(), 101);
            }
            if (!result.Contains("null") && result.Length != 0)
            {
                //LogUtil.debug(LOGGER,"receive << " + result);
            }
            return result;
        }
        public static bool Post(string url, string paramData, out bool IsTimeOut, out string resultMsg)
        {
            resultMsg = "";
            if (paramData.Equals(""))
            {
                int index = url.IndexOf("?");
                if (index > 0)
                {
                    paramData = url.Substring(index + 1, url.Length - index - 1);
                    url = url.Substring(0, index);
                }
            }

            IsTimeOut = false;
            if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
            {
                ServicePointManager.ServerCertificateValidationCallback =
                               new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
            }

            try
            {
                using (var wc = new MyWebClient(5000))
                {
                    if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
                        wc.Headers.Add("Content-Type", "application/json;charset=UTF-8");//x-www-form-urlencoded
                    wc.Encoding = Encoding.UTF8;

                    resultMsg = wc.UploadString(url, "POST", paramData);
                }      //LogUtil.info(result);
            }
            catch (WebException ex)
            {
                IsTimeOut = true;
                LogUtil.error("POST [" + url + "] WebException :" + ex.ToString(), 101);
            }
            catch (Exception e)
            {
                LogUtil.error("POST [" + url + "] ERROR:" + e.ToString(), 101);
            }
            if (resultMsg.Length != 0)//!resultMsg.Contains("null") &&
            {
                return true;
            }
            return false;
        }

        public static string Get(string url)
        {
            return Get(url, Encoding.UTF8);
        }

        public static string Get(string url, Encoding encoding)
        {
            try
            {
                using (var wc = new WebClient { Encoding = encoding })
                {
                    var readStream = wc.OpenRead(url);
                    using (var sr = new StreamReader(readStream, encoding))
                    {
                        var result = sr.ReadToEnd();
                        LogUtil.debug($"HTTP GET:【{url}】【{result}】");
                        return result;
                    }
                }
            }
            catch (Exception e)
            {
                LogUtil.error("HTTP GET ERROR:" + e.Message, 102);
            }
            return "";
        }
    }
}