【问题标题】:How to implement retry policy based on HTML reponse content?如何实现基于 HTML 响应内容的重试策略?
【发布时间】:2019-02-16 14:49:51
【问题描述】:

我正在使用 WebClient 从使用 System.Net.WebClient 类的网站读取一些 html 内容。有时,该网站给我 200 个带有标题标签的响应,上面说呼叫限制已超出,我应该在几秒钟后重试。我正在寻找的是一些重试策略,该策略读取该标题标签并检查该调用限制是否超出错误。如果存在该错误,则应重试。这是调用网站的示例代码

        using (var wc = new GZipWebClient())
        {
            // this html sometimes contain <title> with error message
            html = await wc.DownloadStringTaskAsync(url);
        }

如果有人能提供一个示例代码,说明如何在这种情况下使用 Polly 实现重试逻辑,我将不胜感激。

【问题讨论】:

    标签: c# polly


    【解决方案1】:

    像往常一样使用Polly,并在 html 中出现错误时引发自定义异常。下面的简单例子。

        private async Task DownloadAsync()
        {
           using (var wc = new GZipWebClient())
           {
              // this html sometimes contain <title> with error message
              html = await wc.DownloadStringTaskAsync(url);
    
              if (html.Contains("My Error Message")) 
              {
                  // Log Error
                  throw new MyDownloadFailedException(html);
              }
          }
       }
    
       // In your calling method
       var p = Policy
                .Handle<MyDownloadFailedException>()
                .RetryForever(exception =>  
                {
                    // log.Warning("Failed, retrying....");
                });
    
       p.ExecuteAsync(async() => await DownloadAsync());
    

    【讨论】:

    • 谢谢....我试过了,但它似乎根本没有执行那个网络调用(甚至没有抛出异常)
    • 将答案更新为更好的例子
    • 还添加了指向 Polly 文档的链接
    【解决方案2】:

    Polly 政策可以handle results natively,也可以例外。不需要让通过策略执行的代码抛出异常,触发重试。

    var retryPolicy = Policy
        .HandleResult<string>(s => s.Contains("whatever text triggers retry")) // or whatever more complicated predicate you want
        .Retry...Async(...); // whatever flavour of retry overload you want
    
    private async Task DownloadAsync()
    {
       using (var wc = new GZipWebClient())
       {
          // this html sometimes contain <title> with error message
          html = await retryPolicy.ExecuteAsync(() => wc.DownloadStringTaskAsync(url));
       }
    }
    

    单个策略实例可以同时处理异常和结果,因此也可以将异常处理合并到上述策略中。


    如果来自被调用 API 的响应还包含有关在重试之前等待多长时间的信息(“RetryAfter”),那么 Polly 还会提供specific patterns allowing you to construct a policy which automatically waits for exactly the retry-after time specified in the response

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 2015-04-27
      • 2014-10-07
      • 2015-10-06
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多