HttpHelper.cs 6.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;
using System.Threading;

namespace OnlineStore.Common
{
    public class HttpHelper
    {
        private static  int seq = 1;
        public static  int nextSeq()
        {
            if (seq.Equals(Int32.MaxValue))
            {
                LogUtil.info("seq当前值:" + seq + ",重置seq=0");
                seq = 0;
            }
            Interlocked.Increment(ref seq);
            return seq;
        }

        public static string LastSend = "";
        public static string LastRevice = "";

        private static int isLog = ConfigAppSettings.GetIntValue(Setting_Init.Server_Log_Open);
        //private static object lockObj = "";
        public static Operation PostOP(string url, Operation operation, int lockTime, out bool isTimeOut)
        {
            isTimeOut = false;
            //if (Monitor.TryEnter(lockObj, lockTime))
            //{
            try
            {
                string json = JsonHelper.SerializeObject(operation);
                string result = PostJson(url, json, Encoding.UTF8, out isTimeOut);
                if (!string.IsNullOrEmpty(result))
                {
                    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("Post 出错【operation.op=" + operation.op + "】:" + ex);
            }
            //finally
            //{
            //    Monitor.Exit(lockObj);
            //}
            //}
            //else if (lockTime > 10)
            //{
            //    string json = JsonHelper.SerializeObject(operation);
            //    LogUtil.error(" PostOP " + lockTime + " send " + json + " TryEnter fail ");
            //}
            return null;
        }
        private  static string PostJson(string url, string paramData, Encoding encoding, out bool IsTimeOut)
        {
            IsTimeOut = false;
            if (isLog == 1)
            {
                LogUtil.info("给服务器发送数据【" + paramData + "】 ");
            }
            DateTime startime = DateTime.Now;
            string result = "";

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

            try
            {
                LastSend = DateTime.Now.ToLongTimeString() + " Send :" + paramData;
                   var wc = new MyWebClient(3000);
                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);
                LastRevice = DateTime.Now.ToLongTimeString() + " Revice :" + result;
            }
            catch (WebException ex)
            {
                IsTimeOut = true;
                LogUtil.error(  "POST WebException :" + ex.ToString(), 101);
            }
            catch (Exception e)
            {
                LogUtil.error(  "POST ERROR:" + e.ToString(), 1);
            }
            TimeSpan span = DateTime.Now - startime;
            if (isLog == 1)
            {
                LogUtil.info("收到服务器数据["+span.ToString()+"]【" + result + "】");
            }
            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);
                //LogUtil.info(result);
            }
            catch (WebException ex)
            {
                IsTimeOut = true;
                LogUtil.error("POST [" + url + "] WebException :" + ex.ToString() );
            }
            catch (Exception e)
            {
                LogUtil.error("POST [" + url + "] ERROR:" + e.ToString() );
            }
            if (!result.Contains("null") && result.Length != 0)
            {
                //LogUtil.debug( "receive << " + result);
            }
            if (isLog == 1)
            {
                LogUtil.info("收到服务器数据【" + result + "】");
            }
            return result;
        }

    }
}