HttpHelper.cs 8.3 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.Net.NetworkInformation;

namespace OnlineStore.Common
{
    public class HttpHelper
    { 
        private static int isLog = ConfigAppSettings.GetIntValue(Setting_Init.Server_Log_Open);
        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 string Post(string url, string paramData, int timeOut = 5000)
        {
            bool IsTimeOut = false;
            return Post(url, paramData, Encoding.UTF8, timeOut, out IsTimeOut);
        }
        public static Operation PostOperation(string url, Operation operation, bool simulate = false)
        {
            LogUtil.OutputDebugString("PostOperation");
            lock (serverLock)
            {
                LogUtil.OutputDebugString("PostOperation lock");
                try
                {
                    if (operation == null)
                    {
                        return null;
                    }
                    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("模拟HTTP服务器返回出库入库信息:" + json);
                            return operation;
                        }
                        return null;
                    }

                    try
                    {
                        if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
                        {
                            ServicePointManager.ServerCertificateValidationCallback =
                                           new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
                        }
                        string json = JsonHelper.SerializeObject(operation);
                        var wc = new MyWebClient(5000);
                        if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
                            wc.Headers.Add("Content-Type", "application/json;charset=UTF-8");
                        wc.Encoding = Encoding.UTF8;

                        string result = wc.UploadString(url, "POST", json);

                        if (!string.IsNullOrEmpty(result))
                        {
                            try
                            {
                                Operation reOP = JsonHelper.DeserializeJsonToObject<Operation>(result);
                                if (isLog == 1 || (reOP.op > 0 && reOP.op != 5))
                                {
                                    LogUtil.info("【" + url + "】发送【" + json + "】收到【" + result + "】\r\n[" + JsonHelper.SerializeObject(reOP) + "]");
                                }
                                LogUtil.OutputDebugString("【" + url + "】发送【" + json + "】收到【" + result + "】\r\n[" + JsonHelper.SerializeObject(reOP) + "]");
                                return reOP;
                            }
                            catch (Exception ex)
                            {
                                LogUtil.error("JsonHelper.DeserializeJsonToObject 出错【result=" + result + "】" + ex);
                            }
                        }
                    }
                    catch (WebException ex)
                    {
                        LogUtil.error("POST [" + url + "] WebException :" + ex.ToString(), 101);
                    }
                    catch (Exception e)
                    {
                        LogUtil.error("POST [" + url + "] ERROR:" + e.ToString(), 101);
                    }
                }

                catch (Exception ex)
                {
                    LogUtil.error("Post 出错【operation.op=" + operation.op + "】:" + ex);
                }
                return null;
            }
        }
        static object serverLock = new object();
        public static string Post(string url, string paramData, Encoding encoding, int timeOut, out bool IsTimeOut)
        {
            lock (serverLock)
            {
                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 (isLog == 1)
                {
                    LogUtil.info("给服务器发送数据【" + url + "】【" + paramData + "】 ");
                }
                string result = "";
                try
                {
                    if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
                    {
                        ServicePointManager.ServerCertificateValidationCallback =
                                       new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
                    }
                    var wc = new MyWebClient(timeOut);
                    if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
                        wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                    wc.Encoding = encoding;

                    result = wc.UploadString(url, "POST", paramData);
                    LogUtil.OutputDebugString($"url: {url} , paramData:{paramData} ,result:{result}");
                    //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 (isLog == 1)
                {
                    LogUtil.info("收到服务器数据【" + result + "】");
                }
                return result;
            }
        }

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

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