当前位置:   article > 正文

使用C#实现Http访问类HttpHelper_c# httphelper

c# httphelper

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

HttpHelper类代码如下:

  1.     public class HttpHelper : IDisposable
  2.     {
  3.         private bool _disposable = false;
  4.         /// <summary>
  5.         /// 请求编码格式默认utf-8;
  6.         /// </summary>
  7.         public Encoding HtmlEncoding = Encoding.UTF8;
  8.         /// <summary>
  9.         /// 请求时间
  10.         /// </summary>
  11.         public int Timeout = 5000;
  12.  
  13.         public CookieContainer Cookies = null;
  14.         /// <summary>
  15.         /// 是否记录Cookies
  16.         /// </summary>
  17.         public bool IsRecordCookie = false;
  18.  
  19.         public string ContentType = "application/x-www-form-urlencoded";
  20.  
  21.         public string AcceptLanguage = "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3";
  22.  
  23.         public string KeepAlive = "Keep-Alive";
  24.  
  25.         public string Accept = "*/*";
  26.  
  27.         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";
  28.  
  29.         private static ILogger Logger = Log4NetLoggerFactory.Instance.Create("remote.info");
  30.  
  31.         public HttpHelper()
  32.         {
  33.             //允许最大连接数,突破Http协议的并发连接数限制
  34.             ServicePointManager.DefaultConnectionLimit = 512;
  35.         }
  36.  
  37.         /// <summary>
  38.         /// 上传图片
  39.         /// </summary>
  40.         /// <param name="url"></param>
  41.         /// <param name="bArr"></param>
  42.         /// <param name="fileName"></param>
  43.         /// <returns></returns>
  44.         public HttpRequestEntity RequestFile(string url, byte[] bArr, string fileName = "")
  45.         {
  46.             var result = new HttpRequestEntity { IsSuccess = 0 };
  47.             //后续需要再放开,启用时需增加日志收集
  48.             //if (string.IsNullOrEmpty(url))
  49.             //    throw new ArgumentNullException("请求Url不能为空值");
  50.  
  51.             //if (bArr == null || bArr.Length <= 0)
  52.             //    throw new AccessViolationException("缺少输入数据");
  53.  
  54.             //Stream requestStream = null;
  55.             //StreamReader streamReader = null;
  56.             //HttpWebResponse response = null;
  57.             //HttpWebRequest request = null;
  58.             //try
  59.             //{
  60.             //    request = WebRequest.Create(url) as HttpWebRequest;
  61.             //    request.AllowAutoRedirect = true;
  62.             //    request.Method = "POST";
  63.             //    string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
  64.             //    request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
  65.             //    byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
  66.             //    byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
  67.  
  68.             //    if (string.IsNullOrEmpty(fileName))
  69.             //        fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
  70.  
  71.             //    //请求头部信息 
  72.             //    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));
  73.             //    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
  74.             //    request.Headers.Add("auth", fileName);
  75.             //    Stream postStream = request.GetRequestStream();
  76.             //    postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
  77.             //    postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  78.             //    postStream.Write(bArr, 0, bArr.Length);
  79.             //    postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
  80.             //    postStream.Close();
  81.             //    response = request.GetResponse() as HttpWebResponse;
  82.             //    requestStream = response.GetResponseStream();
  83.             //    if (response.StatusCode == HttpStatusCode.OK)
  84.             //    {
  85.             //        result.IsSuccess = 0;
  86.             //        if (requestStream != null)
  87.             //        {
  88.             //            streamReader = new StreamReader(requestStream, HtmlEncoding);
  89.             //            result.ResponseContent = streamReader.ReadToEnd();
  90.             //        }
  91.             //    }
  92.             //}
  93.             //catch (Exception ex)
  94.             //{
  95.             //    result.IsSuccess = 1;
  96.             //    result.ResponseContent = ex.Message;
  97.             //}
  98.             //finally
  99.             //{
  100.             //    if (requestStream != null)
  101.             //    {
  102.             //        requestStream.Close();
  103.             //        requestStream.Dispose();
  104.             //    }
  105.  
  106.             //    if (streamReader != null)
  107.             //    {
  108.             //        streamReader.Close();
  109.             //        streamReader.Dispose();
  110.             //    }
  111.  
  112.             //    request.Abort();
  113.             //    if (response != null)
  114.             //        response.Close();
  115.  
  116.             //}
  117.  
  118.             return result;
  119.         }
  120.  
  121.         /// <summary>
  122.         /// 基本请求方法
  123.         /// </summary>
  124.         /// <param name="requestType">HTTP请求类型</param>
  125.         /// <param name="url">请求的URL</param>
  126.         /// <param name="requestData">请求参数</param>
  127.         /// <param name="traceID">链路ID,方便查询日志</param>
  128.         /// <param name="markType">请求标识,方便查询日志</param>
  129.         /// <returns></returns>
  130.         private HttpRequestEntity BaseRequest(RequestType requestType, string url, string requestData, string traceID,string markType)
  131.         {
  132.             var result = new HttpRequestEntity { IsSuccess = 0 };
  133.  
  134.             if (string.IsNullOrEmpty(url))
  135.                 throw new ArgumentNullException("请求Url不能为空值");
  136.  
  137.             Stopwatch stopwatch = new Stopwatch();
  138.             stopwatch.Start();
  139.             Dictionary<string, object> resultLog = new Dictionary<string, object>();//log对象
  140.             resultLog.Add("logType", "remote");
  141.             resultLog.Add("traceID", traceID);
  142.             resultLog.Add("localIp", IpHelper.LocalIp);
  143.             resultLog.Add("markType", markType);
  144.             resultLog.Add("url", url);            
  145.             resultLog.Add("requestContent", HttpUtility.UrlDecode(requestData, Encoding.UTF8));
  146.             resultLog.Add("createTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
  147.             StackTrace ss = new StackTrace(true);
  148.             System.Reflection.MethodBase mb = ss.GetFrame(2).GetMethod();//0表示当前栈空间,1表示上一级的栈空间,依次类推
  149.             resultLog.Add("className", mb.DeclaringType.FullName);
  150.             resultLog.Add("methodName", mb.Name);
  151.             HttpStatusCode statusCode = HttpStatusCode.OK;
  152.  
  153.             if (IsRecordCookie)
  154.                 Cookies = new CookieContainer();
  155.             Stream requestStream = null;
  156.             StreamReader streamReader = null;
  157.  
  158.             HttpWebRequest webRe = null;
  159.             HttpWebResponse webPos = null;
  160.             try
  161.             {
  162.                 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  163.                 {
  164.                     ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  165.                     webRe = WebRequest.Create(url) as HttpWebRequest;
  166.                     webRe.ProtocolVersion = HttpVersion.Version10;
  167.                 }
  168.                 else
  169.                 {
  170.                     webRe = (HttpWebRequest)WebRequest.Create(url);
  171.                 }
  172.  
  173.                 webRe.Headers.Add("Accept-Language", AcceptLanguage);
  174.                 webRe.Headers.Add("Keep-Alive", KeepAlive);
  175.                 webRe.UserAgent = UserAgent;
  176.                 webRe.Accept = Accept;
  177.                 webRe.Timeout = Timeout;
  178.                 webRe.ReadWriteTimeout = Timeout;
  179.                 webRe.CookieContainer = Cookies;
  180.  
  181.                 if (requestType == RequestType.Post)
  182.                 {
  183.                     webRe.ContentType = string.Format("{0}; {1}", ContentType, HtmlEncoding.BodyName);
  184.                     byte[] datas = HtmlEncoding.GetBytes(requestData);
  185.                     webRe.Method = "POST";
  186.                     webRe.ContentLength = datas.Length;
  187.                     webRe.MaximumResponseHeadersLength = -1;
  188.                     requestStream = webRe.GetRequestStream();
  189.                     requestStream.Write(datas, 0, datas.Length);
  190.                     requestStream.Flush();
  191.                     requestStream.Close();
  192.                 }
  193.                 else
  194.                     webRe.Method = "GET";
  195.  
  196.                 webPos = (HttpWebResponse)webRe.GetResponse();
  197.                 resultLog.Add("requestType", webRe.Method);
  198.                 statusCode = webPos.StatusCode;
  199.                 result.ResponseLength = webPos.ContentLength;
  200.                 result.ResponseEncodingName = webPos.ContentEncoding;
  201.  
  202.                 requestStream = webPos.GetResponseStream();
  203.                 if (webPos.StatusCode == HttpStatusCode.OK)
  204.                 {
  205.                     result.IsSuccess = 0;
  206.  
  207.                     if (requestStream != null)
  208.                     {
  209.                         streamReader = new StreamReader(requestStream, HtmlEncoding);
  210.                         result.ResponseContent = streamReader.ReadToEnd();
  211.                     }
  212.                 }
  213.             }
  214.             catch (Exception ex)
  215.             {
  216.                 result.IsSuccess = 1;
  217.                 result.ResponseContent = ex.Message;
  218.             }
  219.             finally
  220.             {
  221.                 if (requestStream != null)
  222.                 {
  223.                     requestStream.Close();
  224.                     requestStream.Dispose();
  225.                 }
  226.  
  227.                 if (streamReader != null)
  228.                 {
  229.                     streamReader.Close();
  230.                     streamReader.Dispose();
  231.                 }
  232.  
  233.                 webRe.Abort();
  234.                 if (webPos != null)
  235.                     webPos.Close();
  236.  
  237.             }
  238.             if (result.IsSuccess == 1)
  239.             {
  240.                 resultLog.Add("status", HttpStatusCode.InternalServerError);
  241.                 resultLog.Add("success", false);
  242.                 resultLog.Add("responseContent", result.ResponseContent);
  243.                 stopwatch.Stop();
  244.                 resultLog.Add("elapseTime", stopwatch.Elapsed.TotalMilliseconds);
  245.                 string log = JsonConvert.SerializeObject(resultLog);
  246.                 Logger.Info(log);
  247.                 Logger.Error(log);
  248.             }
  249.             else
  250.             {
  251.                 resultLog.Add("status", statusCode);
  252.                 resultLog.Add("success", true);
  253.                 resultLog.Add("responseContent", result.ResponseContent);
  254.                 stopwatch.Stop();
  255.                 resultLog.Add("elapseTime", stopwatch.Elapsed.TotalMilliseconds);
  256.                 string log = JsonConvert.SerializeObject(resultLog);
  257.                 Logger.Info(log);
  258.             }
  259.             return result;
  260.         }
  261.  
  262.         private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  263.         {
  264.             return true; //总是接受  
  265.         }
  266.  
  267.         /// <summary>
  268.         /// Get请求
  269.         /// </summary>
  270.         /// <param name="url">请求地址</param>
  271.         /// <param name="traceID">链路ID,方便查询日志</param>
  272.         /// <param name="markType">请求标识,方便查询日志</param>
  273.         /// <returns></returns>
  274.         public HttpRequestEntity Request(string url, string traceID, string markType)
  275.         {
  276.             return BaseRequest(RequestType.Get, url, string.Empty, traceID, markType);
  277.         }
  278.  
  279.         /// <summary>
  280.         /// Post请求
  281.         /// </summary>
  282.         /// <param name="url">请求地址Url</param>
  283.         /// <param name="requestData">请求内容参数</param>
  284.         /// <param name="traceID">链路ID,方便查询日志</param>
  285.         /// <param name="markType">请求标识,方便查询日志</param>
  286.         /// <returns></returns>
  287.         public HttpRequestEntity Request(string url, string requestData, string traceID, string markType)
  288.         {
  289.             return BaseRequest(RequestType.Post, url, requestData, traceID, markType);
  290.         }
  291.  
  292.         ~HttpHelper()
  293.         {
  294.             Dispose(false);
  295.         }
  296.  
  297.         #region IDisposable 成员
  298.  
  299.         public void Dispose()
  300.         {
  301.             Dispose(true);
  302.             GC.SuppressFinalize(this);
  303.         }
  304.  
  305.         protected virtual void Dispose(bool disposing)
  306.         {
  307.             if (this._disposable)
  308.                 return;
  309.  
  310.             if (disposing)
  311.             {
  312.  
  313.             }
  314.  
  315.             _disposable = true;
  316.         }
  317.  
  318.         #endregion
  319.     }
  320.  
  321.     /// <summary>
  322.     /// HttpHelper请求方式
  323.     /// </summary>
  324.     public enum RequestType
  325.     {
  326.         /// <summary>
  327.         /// Get请求
  328.         /// </summary>
  329.         Get,
  330.         /// <summary>
  331.         /// Post请求
  332.         /// </summary>
  333.         Post
  334.     }
  335.  
  336.     /// <summary>
  337.     /// HttpHelper请求时返回实体
  338.     /// </summary>
  339.     public class HttpRequestEntity
  340.     {
  341.         /// <summary>
  342.         /// 请求是否成功 0-成功(返回Http状态码200) 1-失败(出现异常)
  343.         /// </summary>
  344.         public int IsSuccess { get; set; }
  345.         /// <summary>
  346.         /// 请求返回内容
  347.         /// </summary>
  348.         public string ResponseContent { get; set; }
  349.         /// <summary>
  350.         /// 请求返回内容长度
  351.         /// </summary>
  352.         public long ResponseLength { get; set; }
  353.         /// <summary>
  354.         /// 请求返回编码类型
  355.         /// </summary>
  356.         public string ResponseEncodingName { get; set; }
  357.     }


调用示例如下:

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号