IRONSOFTWAREHOME
开发者更新

Polly 重试(开发人员如何使用)

Jacob Mellor,Team Iron 的首席技术官
Jacob Mellor
Updated: 2026年4月21日

优雅地处理瞬时故障、超时和异常对于构建稳健和弹性应用程序至关重要。 Polly 是一个流行的 .NET 库,提供弹性和瞬时故障处理能力。 在其众多功能中,"重试"是使用最广泛的策略之一。

在这篇文章中,我们将深入探讨Polly的C#重试策略,探索其用法、配置选项,并提供实用的代码示例。 此外,我们将使用 IronPDF 库进行 PDF 生成与 Polly 重试策略结合以生成表单请求结果的PDF。

什么是 Polly 重试?

Polly 重试是一种由 Polly 库提供的策略,允许开发人员自动重试可能由于错误或瞬时故障而失败的操作。 瞬时故障是网络故障、服务不可用或其他瞬时问题引起的临时错误。

通过 Polly 的重试策略,可以定义重试操作的规则,包括最大重试次数、多个重试之间的延迟以及重试失败请求的条件。这有助于构建能够从临时故障中恢复而不崩溃或对最终用户造成干扰的弹性应用程序。

开始使用 Polly 重试

在深入代码示例之前,让我们建立基本的理解如何在 C# 项目中安装和配置 Polly。

安装 Polly

您可以通过以下命令在 NuGet 程序包管理器控制台中安装 Polly:

PM > Install-Package Polly

或通过 .NET CLI:

> dotnet add package Polly

添加 Polly 使用语句

在您的 C# 文件中,包含 Polly 命名空间:

using Polly;

基本重试策略示例

让我们从一个简单的示例开始,我们重试一个模拟从远程服务获取数据的操作。我们将设置一个最大重试 3 次和每次重试之间固定 2 秒超时时间延迟的重试策略。

using System;
using System.Net.Http;
using Polly;

namespace PollyRetryExample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Define a retry policy that handles HttpRequestException with a maximum of 3 retries
            var retryPolicy = Policy
                .Handle<HttpRequestException>() // Specify the exception type to handle
                .WaitAndRetry(
                    3, // Max retry attempts
                    retryAttempt => TimeSpan.FromSeconds(2), // Fixed retry delay
                    (exception, timeSpan, retryCount, context) =>
                    {
                        Console.WriteLine("Retry {0} due to {1}", retryCount, exception.Message);
                    });

            try
            {
                // Execute the action within the context of the retry policy
                retryPolicy.Execute(() =>
                {
                    FetchDataFromRemoteService();
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed after 3 retries: {0}", ex.Message);
            }
        }

        // Simulate fetching data that throws HttpRequestException
        public static void FetchDataFromRemoteService()
        {
            throw new HttpRequestException("Failed to fetch data from remote service");
        }
    }
}

在此示例中:

  • Handle<HttpRequestException>() 指定我们要处理 HttpRequestException 并在发生时重试操作。
  • WaitAndRetry() 将重试策略配置为重试3次,并在重试之间固定延迟2秒(指定最大持续时间)。
  • onRetry 委托在重试时记录一条消息。

Polly 重试(开发人员如何工作):图1

高级重试策略配置

指数退避

指数退避是一种流行的重试策略,其中请求和重试之间的延迟指数增加。 Polly 提供了一种使用 WaitAndRetry() 实现指数退避的便捷方式。

var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .WaitAndRetry(
        retryCount: 3, // Max retry attempts
        sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)), // Exponential delay
        onRetry: (exception, timeSpan, retryCount, context) =>
        {
            Console.WriteLine($"Retry {retryCount} due to {exception.Message}");
        });

Polly 重试(开发人员如何工作):图2

与断路器重试

将重试与断路器结合使用可以通过防止服务持续失败时重复重试来进一步增强弹性。 Polly 允许您轻松结合重试和断路器策略。

// Define a circuit breaker policy
var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreaker(
        exceptionsAllowedBeforeBreaking: 3, // Number of exceptions before breaking
        durationOfBreak: TimeSpan.FromSeconds(30), // Time circuit stays open
        onBreak: (ex, breakDelay) =>
        {
            Console.WriteLine($"Circuit broken due to {ex.Message}. Retry after {breakDelay.TotalSeconds} seconds.");
        },
        onReset: () =>
        {
            Console.WriteLine("Circuit reset.");
        });

// Define a retry policy
var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .WaitAndRetry(
        retryCount: 3, // Max retry attempts
        sleepDurationProvider: attempt => TimeSpan.FromSeconds(2), // Fixed retry delay
        onRetry: (exception, timeSpan, retryCount, context) =>
        {
            Console.WriteLine($"Retry {retryCount} due to {exception.Message}");
        });

// Combine both policies into a single policy wrap
var policyWrap = Policy.Wrap(circuitBreakerPolicy, retryPolicy);

在此示例中:

  • CircuitBreaker() 定义了一个断路器策略,在发生3个异常后断开,并保持打开30秒。
  • Policy.Wrap() 将断路器和重试策略合并为一个策略。

Polly 重试(开发人员如何工作):图3

IronPDF简介

IronPDF C# PDF 库概述 是一个强大的 C# 库,允许开发人员在其 .NET 应用程序中创建、编辑和操作 PDF 文档。 无论您是需要创建发票、报告还是任何其他类型的 PDF 文档,IronPDF 提供了一个简化过程的直观 API。

借助 IronPDF,您可以轻松将 HTML、CSS 甚至 ASP.NET 网页转换为 PDF,使其成为众多应用程序的万能工具。 此外,它提供添加文本、图像和交互元素等高级功能,并使用加密和数字签名对 PDF 进行安全处理。

IronPDF 擅长HTML 到 PDF 转换,确保原始布局和样式的精确保留。 它非常适合从基于网页的内容(如报告、发票和文档)生成 PDF。 IronPDF 支持从 HTML 文件、URL 和原始 HTML 字符串转换为高质量 PDF 文件。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

与 IronPDF 结合的 Polly 重试

当使用 IronPDF 时,可能会遇到需要从外部资源获取数据或在生成 PDF 之前执行复杂操作的场景。

在这些情况下,您可能会遇到瞬时故障或临时问题,这可能导致 PDF 生成失败。 为了优雅地处理这些瞬时故障,您可以将 Polly 重试与 IronPDF 结合使用。

安装 IronPDF 和 Polly

在开始之前,确保在您的项目中安装 IronPDF NuGet 包。

PM > Install-Package IronPdf

使用 Polly 重试与 IronPDF

让我们看看一个使用 Polly 重试来处理使用 IronPDF 生成 PDF 时瞬时故障的示例。 在以下示例中,我们将模拟从外部 API 获取数据,然后基于该数据生成 PDF。 我们将使用 Polly Retry 来执行数据获取操作,以防失败。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using IronPdf;
using Polly;

namespace IronPdfWithPollyRetry
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            // Define a retry policy with async capability
            var retryPolicy = Policy
                .Handle<HttpRequestException>() // Specify exception type to handle
                .WaitAndRetryAsync(
                    3, // Retry attempts
                    retryAttempt => TimeSpan.FromSeconds(2), // Calculated retry delay
                    (exception, timeSpan, retryCount, context) =>
                    {
                        Console.WriteLine("Retry " + retryCount + " due to " + exception.Message);
                    });

            // Execute the retry policy asynchronously
            var pdf = await retryPolicy.ExecuteAsync(async () =>
            {
                var data = await FetchDataFromExternalApiAsync(); // Fetch data from an external source
                return GeneratePdfFromData(data); // Generate PDF using fetched data
            });

            pdf.SaveAs("GeneratedDocument.pdf");
        }

        // Simulate fetching data from an external API
        static async Task<string> FetchDataFromExternalApiAsync()
        {
            await Task.Delay(100); // Simulate delay
            throw new HttpRequestException("Failed to fetch data from external API");
        }

        // Generate PDF using IronPDF based on the fetched data
        static PdfDocument GeneratePdfFromData(string data)
        {
            var htmlContent = "<html><body><h1>Data: " + data + "</h1></body></html>";
            var renderer = new ChromePdfRenderer();
            return renderer.RenderHtmlAsPdf(htmlContent);
        }
    }
}

此 C# 代码演示如何使用 Polly 库为 IronPDF 生成 PDF 文档实现重试策略。 Main 方法使用 Polly 的 WaitAndRetryAsync 方法初始化重试策略。

此策略指定它应处理 HttpRequestException 并在初始尝试和重试之间延迟2秒重试操作最多3次。 如果发生重试失败,则打印一条消息到控制台指出重试尝试次数和异常消息。

在 Main 方法内部,重试策略逻辑使用 retryPolicy.ExecuteAsync() 异步执行。 在此执行过程中,两个异步操作被串联在一起:FetchDataFromExternalApiAsync() 和 GeneratePdfFromData(data)。

如果 FetchDataFromExternalApiAsync() 失败(因为它是故意通过模拟异常设置的),重试策略将捕获 HttpRequestException,记录重试尝试,并重试操作。

FetchDataFromExternalApiAsync() 方法模拟从外部 API 获取数据,带有延迟,并故意抛出一个 HttpRequestException 来模拟请求失败。

Polly 重试(开发人员如何工作):图4

结论

总之,Polly 的重试策略在处理瞬时故障和确保 C# 应用程序的稳健性方面具有极大的价值。 其在配置重试尝试、延迟和条件方面的灵活性使得开发人员能够根据特定需求量身定制弹性策略。

无论是独立使用还是与库(如 IronPDF)结合使用,Polly 促进了应用程序的创建,这些应用程序可以优雅地从临时故障中恢复,提高用户体验和软件的可靠性。

通过集成 Polly 的重试功能,开发人员可以构建更具弹性的系统,这些系统可以适应和从瞬时问题中恢复,从而最终提高应用程序的整体质量和可靠性。

IronPDF 是市场上最好的 C# PDF 库,它还提供 IronPDF 的试用许可证 价格从 $999 美元起。

要了解使用 IronPDF 进行 HTML 到 PDF 转换,请访问以下IronPDF HTML 到 PDF 转换教程。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥。

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

OR
bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥。
无需信用卡或创建账户
C# 用于 PDF 的 NuGet 库
通过 NuGet 安装

版本: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. 在解决方案资源管理器中,右键点击引用,管理 NuGet 包
  2. 选择浏览并搜索 “IronPDF”
  3. 选择包并安装
C# PDF DLL
下载 DLL

版本: 2026.9

或在此处下载 Windows 安装程序。

  1. 下载并解压 IronPDF 到您的解决方案目录中的 ~/Libs 之类的位置
  2. 在 Visual Studio 解决方案资源管理器中,右键点击引用。选择浏览,“IronPDF.dll”

$999 起