C#实现HTTP访问类HttpHelper

博客 分享
0 216
优雅殿下
优雅殿下 2022-09-05 17:04:05
悬赏:0 积分 收藏

C#实现HTTP访问类HttpHelper

C#实现HTTP访问类HttpHelper(asp.net)

在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了。示例中的HttpHelper类使用Log4Net记录了每次调用的请求内容和响应内容的日志,并且每条日志都带上了链路ID和标识,这样方便我们在排查问题时能快速的找到当时的请求和响应内容,进而定位分析问题。大家在使用的时候如不需要记录日志,删除掉即可。

HttpHelper类代码如下:

    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; }    }

调用示例如下:

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

 


如对您有帮助劳烦帮忙点个赞,收藏关注一下,相互学习,共同进步。

posted @ 2022-09-05 16:29 华小睿 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员