HttpHelper.cs 9.5 KB
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Collections;
using System.Net;
using System.Net.Security;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Reflection;
using log4net;
using System.Collections.Specialized;
using System.Net.NetworkInformation;

namespace OnlineStore.Common
{ 
    public class HttpHelper
    {
        public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        private static int isLog = ConfigAppSettings.GetIntValue(Setting_Init.Server_Log_Open);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url"></param>
        /// <param name="operation"></param>
        /// <param name="simulate">是否模拟服务器返回结果</param>
        /// <returns></returns>
        public static Operation Post(string url, Operation operation, bool simulate)
        {
            try
            {
                if (simulate)
                {//模拟服务器返回
                    operation.status = 200;
                    operation.data.Clear();
                    operation.data.Add("posId", "A001");
                    string pos = "D100-111#D102-222#D104-333";
                    operation.data.Add("pos", pos);
                    if (operation.op == 1 || operation.op == 2)
                    {//入库或出库

                        string json = JsonHelper.SerializeObject(operation);
                        LogUtil.error(LOGGER, "模拟HTTP服务器返回出库入库信息:" + json);
                        return operation;
                    }
                }
                else
                {
                    string json = "";
                    try
                    {
                        json = JsonHelper.SerializeObject(operation);
                    }
                    catch (Exception ex)
                    {
                        LOGGER.Error("JsonHelper.SerializeObject(operation) 出错【operation.op=" + operation.op + "】" + ex);
                    }
                    string result = Post(url, json);
                    if (!string.IsNullOrEmpty(result))
                    {
                        try
                        {
                            Operation operation1 = JsonHelper.DeserializeJsonToObject<Operation>(result);

                            if (isLog == 1)
                            {
                                LOGGER.Info("Post【" + url + "】【" + json + "】收到【" + result + "】");
                            }
                            else if (operation1 != null && operation1.op > 0)
                            {
                                LOGGER.Info("Post【" + url + "】【" + json + "】收到【" + result + "】");
                            }
                            return operation1;
                        }
                        catch (Exception ex)
                        {
                            LOGGER.Error("JsonHelper.DeserializeJsonToObject 出错【result=" + result + "】" + ex);
                        }
                    }
                   
                }
            }
            catch (Exception ex)
            {
                LOGGER.Error("Post 出错【operation.op=" + operation.op + "】:" + ex);
            }
            return null;
        }
        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(LOGGER,"Ping IP " + ip + " : false");
                    //不通 
                    return false;
                }
            }
            return true;
        }
        public static string Post(string url, NameValueCollection paramData, int timeOut = 10000)
        {

            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))
                {
                    byte[] buf = wc.UploadValues(url, "POST", paramData);
                    result = Encoding.UTF8.GetString(buf);
                }
                //LogUtil.info(result);
            }
            catch (Exception e)
            {
                LogUtil.error(LOGGER,"POST ERROR:" + e.ToString() + "\r\n" + url, 101);
            }

            return result;
        }
        public static string Post(string url, string paramData, int timeOut = 10000)
        {
            return Post(url, paramData, Encoding.UTF8, timeOut);
        }

        public static string Post(string url, string paramData, Encoding encoding, int timeOut = 10000)
        {

            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");
                    }
                    wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    wc.Encoding = encoding;

                    result = wc.UploadString(url, "POST", paramData);
                }
                //LogUtil.info(result);
            }
            catch (Exception e)
            {
                LogUtil.error(LOGGER,"POST ERROR:" + e.ToString() + "\r\n" + url, 101);
            }

            return result;
        }
        static object lockpost = new object();
        public static Operation Post(string url, Operation operation, int timeout = 5000, bool printlog = false)
        {
            try
            {
                string json = JsonHelper.SerializeObject(operation);
                string result = Post(url, json, timeout);
                Operation op = JsonHelper.DeserializeJsonToObject<Operation>(result);

                if (printlog)
                {
                    LogUtil.info("Send [" + json + "]  Revice [" + result + "]");
                }
                return op;
            }
            catch (Exception ex)
            {
                LogUtil.error(LOGGER,"Post 出错【operation.op=" + operation.op + "】:" + ex);
            }
            return null;
        }
        public static string Get(string url)
        {
            return Get(url, Encoding.UTF8);
        }
        public static string Get(string url, Encoding encoding, int timeOut = 10000)
        {
            try
            {
                LogUtil.debug("HTTP GET FROM: " + url);
                using (var wc = new MyWebClient { Encoding = encoding })
                {
                    var readStream = wc.OpenRead(url);
                    using (var sr = new StreamReader(readStream, encoding))
                    {
                        var result = sr.ReadToEnd();
                        LogUtil.debug("receive << " + result);
                        return result;
                    }
                }
            }
            catch (Exception e)
            {
                LogUtil.error(LOGGER,"HTTP GET ERROR:" + e.Message, 102);
            }
            return "";
        }


        public static string PostJson(string url, Dictionary<string, string> paramDataMap, Encoding encoding, int timeOut = 10000)
        {

            string result = "";

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

            try
            {
                string paramData = JsonHelper.SerializeObject(paramDataMap);
                using (var wc = new MyWebClient(timeOut))
                {
                    if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
                    {
                        wc.Headers.Add("Content-Type", "application/json;charset=UTF-8");
                    }
                    wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                    wc.Encoding = encoding;

                    result = wc.UploadString(url, "POST", paramData);
                }
                //LogUtil.info(result);
            }
            catch (Exception e)
            {
                LogUtil.error(LOGGER,"POST ERROR:" + e.ToString() + "\r\n" + url, 101);
            }

            return result;
        } 
    }
}