码迷,mamicode.com
首页 > Web开发 > 详细

[Asp.net core]使用Polly网络请求异常重试

时间:2018-04-09 18:57:02      阅读:766      评论:0      收藏:0      [点我收藏+]

标签:png   ima   color   pos   成功   minutes   .exe   ring   orm   

摘要

在网络传输过程中,不能保证所有的请求都能正确的被服务端接受或者处理,那么进行简单的重试可以进行简单的补救。比如现在大部分支付功能,在支付成功之后,需要回调我们网站的接口,并且要求我们的接口给一个类似成功的响应,支付端收到我们的成功响应,就不再进行重试请求了。

比如:支付宝文档中有这么一段描述

技术分享图片

Polly简单实用

        private ILog _log;
        /// <summary>
        /// 重试时间点
        /// </summary>
        private TimeSpan[] _retryTimes = new[] {
            TimeSpan.FromSeconds(1),
            TimeSpan.FromSeconds(5),
            TimeSpan.FromSeconds(10),
            TimeSpan.FromSeconds(20),
            TimeSpan.FromMinutes(1)
        };
        /// <summary>
        /// 提交文本
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public string PostTxt(string url, Dictionary<string, string> paras)
        {
            try
            {  
                     string data = ConvertDic2QueryString(paras);
                     byte[] byteArray = Encoding.UTF8.GetBytes(data);
                var retry4TimePolicy = Polly.Policy.Handle<WebException>().WaitAndRetry(
                  _retryTimes,
                          (ex, ts, i, context) =>
                          {
                              _log.Info(new LogModel
                              {
                                  Content = $"Request:{url},data:{ConvertDic2QueryString(paras)},第{i}次重试",
                                  userId= "",
                                  Op = "posttxt"
                              });
                          });
                return retry4TimePolicy.Execute(() =>
                 {                   
                     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                     request.ContentType = "application/x-www-form-urlencoded";
                     request.Method = "POST";
                     request.ContentLength = byteArray.Length;
                     request.Timeout = 60000;
                     if (url.StartsWith("https"))
                     {
                         request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
                     }
                     Stream requestStream = request.GetRequestStream();
                     requestStream.Write(byteArray, 0, byteArray.Length);
                     HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
                     StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
                     String sResult = reader.ReadToEnd();
                     requestStream.Close();
                     reader.Close();
                     webResponse.Close();
                     return sResult;
                 });

            }
            catch (WebException ex)
            {
                throw ex;
            }
           
        }
  public string ConvertDic2QueryString(Dictionary<string, string> dic)
        {
            if (dic == null)
            {
                return string.Empty;
            }
            StringBuilder sb = new StringBuilder();
            foreach (var key in dic.Keys)
            {
                sb.AppendFormat("{0}={1}&", key, HttpUtility.UrlEncode(dic[key]));

            }
            return sb.ToString().TrimEnd(&);
        }

可以类似上面的一种请求,在捕获到webException异常时,立马重试一次,检查网络是否正常,如果仍不能正确进行请求,下次5s,10s,20s,进行尝试,如果仍不正常,则在1分钟后进行最后尝试。否则认为网络不正常,则抛出异常,进行日志记录。

 总结

Polly支持多种重试策略,感兴趣的可以移步这里。

https://www.cnblogs.com/CreateMyself/p/7589397.html

http://www.cnblogs.com/xishuai/p/asp-net-core-polly.html

[Asp.net core]使用Polly网络请求异常重试

标签:png   ima   color   pos   成功   minutes   .exe   ring   orm   

原文地址:https://www.cnblogs.com/wolf-sun/p/8761380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!