Use C# to implement Http access class HttpHelper

During project development, we often access third-party interfaces. For example, the third-party interface we need to access is Web API. At this time, we need to use HttpHelper to call the remote interface. The HttpHelper class in the example uses Log4Net to record the log of the request content and response content of each call, and each log has a link ID and identifier, so that we can quickly find the request and response content at that time when troubleshooting. Respond to the content, and then locate and analyze the problem. If you don't need to record the log when you use it, just delete it.

The HttpHelper class code is as follows:

    public class HttpHelper : IDisposable
    {
        private bool _disposable = false;
        /// <summary>
        /// 请求编码格式默认utf-8;
        /// </summary>
        public Encoding HtmlEncoding = Encoding.UTF8;
        /// <summary>
        /// 请求时间
        /// </summary>
        public int Timeout = 5000;
 
        public CookieContainer Cookies = null;
        /// <summary>
        /// 是否记录Cookies
        /// </summary>
        public bool IsRecordCookie = false;
 
        public string ContentType = "application/x-www-form-urlencoded";
 
        public string AcceptLanguage = "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3";
 
        public string KeepAlive = "Keep-Alive";
 
        public string Accept = "*/*";
 
        private const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240";
 
        private static ILogger Logger = Log4NetLoggerFactory.Instance.Create("remote.info");
 
        public HttpHelper()
        {
            //允许最大连接数,突破Http协议的并发连接数限制
            ServicePointManager.DefaultConnectionLimit = 512;
        }
 
        /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="url"></param>
        /// <param name="bArr"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public HttpRequestEntity RequestFile(string url, byte[] bArr, string fileName = "")
        {
            var result = new HttpRequestEntity { IsSuccess = 0 };
            //后续需要再放开,启用时需增加日志收集
            //if (string.IsNullOrEmpty(url))
            //    throw new ArgumentNullException("请求Url不能为空值");
 
            //if (bArr == null || bArr.Length <= 0)
            //    throw new AccessViolationException("缺少输入数据");
 
            //Stream requestStream = null;
            //StreamReader streamReader = null;
            //HttpWebResponse response = null;
            //HttpWebRequest request = null;
            //try
            //{
            //    request = WebRequest.Create(url) as HttpWebRequest;
            //    request.AllowAutoRedirect = true;
            //    request.Method = "POST";
            //    string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
            //    request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
            //    byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
            //    byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
 
            //    if (string.IsNullOrEmpty(fileName))
            //        fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
 
            //    //请求头部信息 
            //    StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
            //    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
            //    request.Headers.Add("auth", fileName);
            //    Stream postStream = request.GetRequestStream();
            //    postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
            //    postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
            //    postStream.Write(bArr, 0, bArr.Length);
            //    postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
            //    postStream.Close();
            //    response = request.GetResponse() as HttpWebResponse;
            //    requestStream = response.GetResponseStream();
            //    if (response.StatusCode == HttpStatusCode.OK)
            //    {
            //        result.IsSuccess = 0;
            //        if (requestStream != null)
            //        {
            //            streamReader = new StreamReader(requestStream, HtmlEncoding);
            //            result.ResponseContent = streamReader.ReadToEnd();
            //        }
            //    }
            //}
            //catch (Exception ex)
            //{
            //    result.IsSuccess = 1;
            //    result.ResponseContent = ex.Message;
            //}
            //finally
            //{
            //    if (requestStream != null)
            //    {
            //        requestStream.Close();
            //        requestStream.Dispose();
            //    }
 
            //    if (streamReader != null)
            //    {
            //        streamReader.Close();
            //        streamReader.Dispose();
            //    }
 
            //    request.Abort();
            //    if (response != null)
            //        response.Close();
 
            //}
 
            return result;
        }
 
        /// <summary>
        /// 基本请求方法
        /// </summary>
        /// <param name="requestType">HTTP请求类型</param>
        /// <param name="url">请求的URL</param>
        /// <param name="requestData">请求参数</param>
        /// <param name="traceID">链路ID,方便查询日志</param>
        /// <param name="markType">请求标识,方便查询日志</param>
        /// <returns></returns>
        private HttpRequestEntity BaseRequest(RequestType requestType, string url, string requestData, string traceID,string markType)
        {
            var result = new HttpRequestEntity { IsSuccess = 0 };
 
            if (string.IsNullOrEmpty(url))
                throw new ArgumentNullException("请求Url不能为空值");
 
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            Dictionary<string, object> resultLog = new Dictionary<string, object>();//log对象
            resultLog.Add("logType", "remote");
            resultLog.Add("traceID", traceID);
            resultLog.Add("localIp", IpHelper.LocalIp);
            resultLog.Add("markType", markType);
            resultLog.Add("url", url);            
            resultLog.Add("requestContent", HttpUtility.UrlDecode(requestData, Encoding.UTF8));
            resultLog.Add("createTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            StackTrace ss = new StackTrace(true);
            System.Reflection.MethodBase mb = ss.GetFrame(2).GetMethod();//0表示当前栈空间,1表示上一级的栈空间,依次类推
            resultLog.Add("className", mb.DeclaringType.FullName);
            resultLog.Add("methodName", mb.Name);
            HttpStatusCode statusCode = HttpStatusCode.OK;
 
            if (IsRecordCookie)
                Cookies = new CookieContainer();
            Stream requestStream = null;
            StreamReader streamReader = null;
 
            HttpWebRequest webRe = null;
            HttpWebResponse webPos = null;
            try
            {
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                    webRe = WebRequest.Create(url) as HttpWebRequest;
                    webRe.ProtocolVersion = HttpVersion.Version10;
                }
                else
                {
                    webRe = (HttpWebRequest)WebRequest.Create(url);
                }
 
                webRe.Headers.Add("Accept-Language", AcceptLanguage);
                webRe.Headers.Add("Keep-Alive", KeepAlive);
                webRe.UserAgent = UserAgent;
                webRe.Accept = Accept;
                webRe.Timeout = Timeout;
                webRe.ReadWriteTimeout = Timeout;
                webRe.CookieContainer = Cookies;
 
                if (requestType == RequestType.Post)
                {
                    webRe.ContentType = string.Format("{0}; {1}", ContentType, HtmlEncoding.BodyName);
                    byte[] datas = HtmlEncoding.GetBytes(requestData);
                    webRe.Method = "POST";
                    webRe.ContentLength = datas.Length;
                    webRe.MaximumResponseHeadersLength = -1;
                    requestStream = webRe.GetRequestStream();
                    requestStream.Write(datas, 0, datas.Length);
                    requestStream.Flush();
                    requestStream.Close();
                }
                else
                    webRe.Method = "GET";
 
                webPos = (HttpWebResponse)webRe.GetResponse();
                resultLog.Add("requestType", webRe.Method);
                statusCode = webPos.StatusCode;
                result.ResponseLength = webPos.ContentLength;
                result.ResponseEncodingName = webPos.ContentEncoding;
 
                requestStream = webPos.GetResponseStream();
                if (webPos.StatusCode == HttpStatusCode.OK)
                {
                    result.IsSuccess = 0;
 
                    if (requestStream != null)
                    {
                        streamReader = new StreamReader(requestStream, HtmlEncoding);
                        result.ResponseContent = streamReader.ReadToEnd();
                    }
                }
            }
            catch (Exception ex)
            {
                result.IsSuccess = 1;
                result.ResponseContent = ex.Message;
            }
            finally
            {
                if (requestStream != null)
                {
                    requestStream.Close();
                    requestStream.Dispose();
                }
 
                if (streamReader != null)
                {
                    streamReader.Close();
                    streamReader.Dispose();
                }
 
                webRe.Abort();
                if (webPos != null)
                    webPos.Close();
 
            }
            if (result.IsSuccess == 1)
            {
                resultLog.Add("status", HttpStatusCode.InternalServerError);
                resultLog.Add("success", false);
                resultLog.Add("responseContent", result.ResponseContent);
                stopwatch.Stop();
                resultLog.Add("elapseTime", stopwatch.Elapsed.TotalMilliseconds);
                string log = JsonConvert.SerializeObject(resultLog);
                Logger.Info(log);
                Logger.Error(log);
            }
            else
            {
                resultLog.Add("status", statusCode);
                resultLog.Add("success", true);
                resultLog.Add("responseContent", result.ResponseContent);
                stopwatch.Stop();
                resultLog.Add("elapseTime", stopwatch.Elapsed.TotalMilliseconds);
                string log = JsonConvert.SerializeObject(resultLog);
                Logger.Info(log);
            }
            return result;
        }
 
        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受  
        }
 
        /// <summary>
        /// Get请求
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="traceID">链路ID,方便查询日志</param>
        /// <param name="markType">请求标识,方便查询日志</param>
        /// <returns></returns>
        public HttpRequestEntity Request(string url, string traceID, string markType)
        {
            return BaseRequest(RequestType.Get, url, string.Empty, traceID, markType);
        }
 
        /// <summary>
        /// Post请求
        /// </summary>
        /// <param name="url">请求地址Url</param>
        /// <param name="requestData">请求内容参数</param>
        /// <param name="traceID">链路ID,方便查询日志</param>
        /// <param name="markType">请求标识,方便查询日志</param>
        /// <returns></returns>
        public HttpRequestEntity Request(string url, string requestData, string traceID, string markType)
        {
            return BaseRequest(RequestType.Post, url, requestData, traceID, markType);
        }
 
        ~HttpHelper()
        {
            Dispose(false);
        }
 
        #region IDisposable 成员
 
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
 
        protected virtual void Dispose(bool disposing)
        {
            if (this._disposable)
                return;
 
            if (disposing)
            {
 
            }
 
            _disposable = true;
        }
 
        #endregion
    }
 
    /// <summary>
    /// HttpHelper请求方式
    /// </summary>
    public enum RequestType
    {
        /// <summary>
        /// Get请求
        /// </summary>
        Get,
        /// <summary>
        /// Post请求
        /// </summary>
        Post
    }
 
    /// <summary>
    /// HttpHelper请求时返回实体
    /// </summary>
    public class HttpRequestEntity
    {
        /// <summary>
        /// 请求是否成功 0-成功(返回Http状态码200) 1-失败(出现异常)
        /// </summary>
        public int IsSuccess { get; set; }
        /// <summary>
        /// 请求返回内容
        /// </summary>
        public string ResponseContent { get; set; }
        /// <summary>
        /// 请求返回内容长度
        /// </summary>
        public long ResponseLength { get; set; }
        /// <summary>
        /// 请求返回编码类型
        /// </summary>
        public string ResponseEncodingName { get; set; }
    }


An example call is as follows:

HttpHelper helper = new HttpHelper();
HttpRequestEntity response = helper.Request("需要访问的URL", "请求需要的参数", "访问链路ID", "访问标识");
if (response.IsSuccess != 0)
{
    //程序处理异常,请重试!
}
else
{
    //请求响应成功    
}

Guess you like

Origin blog.csdn.net/qq_41872328/article/details/126740128