HttpHelper.cs 9.6 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
    {
        public static string PostAndWait(string url, string paramData)
        {
            string postRes = "";
            DateTime startTime = DateTime.Now;
            System.Threading.Tasks.Task postTask = new System.Threading.Tasks.Task(delegate
            {
                while ((DateTime.Now - startTime).TotalMinutes < 60)
                {
                    postRes = PostJson(url, paramData, Encoding.UTF8, out bool isTimeOut);
                    ResponseData data = JsonHelper.DeserializeJsonToObject<ResponseData>(postRes);

                    if (data != null)
                    {
                        if (data.code.Equals(99) || data.code.Equals(100))
                        {
                            LogUtil.info("Response Code=" + data.code + " 系统正在更新。。。3秒后重试");
                            System.Threading.Thread.Sleep(3000);
                        }
                        else if (isTimeOut.Equals(true))
                        {
                            LogUtil.info(" 从服务器获取信息超时。。。3秒后重试");
                            System.Threading.Thread.Sleep(3000);
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (isTimeOut.Equals(true))
                    {
                        LogUtil.info(" 从服务器获取信息超时。。。3秒后重试");
                        System.Threading.Thread.Sleep(3000);
                    }
                }
            });
            postTask.Wait();
            return postRes;
        }

       
        public static Operation PostJson(string url, Operation operation, bool simulate=false)
        {
            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("模拟HTTP服务器返回出库入库信息:" + json);
                        return operation;
                    }
                }
                else
                {
                    string json = "";
                    try
                    {
                        json = JsonHelper.SerializeObject(operation);
                    }
                    catch (Exception ex)
                    {
                        LogUtil.error("JsonHelper.SerializeObject(operation) 出错【operation.op=" + operation.op + "】" + ex);
                    }
                    bool IsTimeOut = false;
                    string result = PostJson(url, json,Encoding.UTF8,out IsTimeOut);
                    if (!string.IsNullOrEmpty(result))
                    {
                        try
                        {
                            Operation resultOP = JsonHelper.DeserializeJsonToObject<Operation>(result);
                            if (resultOP != null && (!operation.seq.Equals(resultOP.seq)))
                            {
                                LogUtil.error(" seq  error : send  【" + json + "】 " + ",receive 【 " + result + "】");
                            }
                            if (resultOP != null && (!operation.cid.Equals(resultOP.cid)))
                            {
                                LogUtil.error(" cid  error : send  【" + json + "】 " + ",receive 【 " + result + "】,return null");
                                return null;
                            }
                            return resultOP;
                        }
                        catch (Exception ex)
                        {
                            LogUtil.error("JsonHelper.DeserializeJsonToObject 出错【result=" + result + "】" + ex);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("Post 出错【operation.op=" + operation.op + "】:" + ex);
            }
            return null;
        }
        private static int isLog = ConfigAppSettings.GetIntValue(Setting_Init.Server_Log_Open);
        public static string LastServerMsg = "";
        private static string PostJson(string url, string paramData, Encoding encoding, out bool isTimeOut)
        {
            isTimeOut = false;
            if (isLog == 1)
            {
                LogUtil.info("给服务器发送数据【" + paramData + "】 ");
            }

            string result = "";

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

            try
            {
                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;

                result = wc.UploadString(url, "POST", paramData);
            }
            catch (WebException e)
            {
                isTimeOut = true;
                LogUtil.error("POST TimeOut:" + e.ToString(), 1);
            }
            catch (Exception ex)
            {
                LogUtil.error("POST ERROR:" + ex.ToString(), 1);
            }
            if (isLog == 1)
            {
                LogUtil.info("收到服务器数据【" + result + "】");
            }
            LastServerMsg = DateTime.Now.ToLongTimeString() + " URL:" + url + "\r\n"
              + "发送:" + paramData + "\r\n"
                 + "接收:" + result + "\r\n";
            return result;
        }


        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;
            if (isLog == 1)
            {
                LogUtil.info("给服务器发送数据【" + url + "】【" + paramData + "】 ");
            }
            string result = "";

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

            try
            {
                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); 
            }
            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)
        {
            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, 2);
            }
            return "";
        }

    }
    internal class ResponseData
    {
        //{"code":0,"msg":"ok","data":"7"} 
        public int code { get; set; }

        public string msg { get; set; }

        public Dictionary<string, string> data { get; set; }
    }
}