.NET 帮助 .NET Core Polly(开发者如何使用) Curtis Chau 已更新:七月 28, 2025 Download IronPDF NuGet 下载 DLL 下载 Windows 安装程序 Start Free Trial Copy for LLMs Copy for LLMs Copy page as Markdown for LLMs Open in ChatGPT Ask ChatGPT about this page Open in Gemini Ask Gemini about this page Open in Grok Ask Grok about this page Open in Perplexity Ask Perplexity about this page Share Share on Facebook Share on X (Twitter) Share on LinkedIn Copy URL Email article Polly 是一个 .NET 弹性策略和瞬态故障处理库,允许开发人员表达弹性策略,如重试策略、断路器、超时、舱壁隔离策略和回退。 Polly 以 ASP.NET Core 为目标,使其成为 .NET Core 弹性的重要工具。 Polly 是线程安全的,支持处理多个并发请求并成功响应。 本教程将提供有关瞬态故障处理 .NET 库 Polly 的更多详细信息,以及如何在 ASP.NET Core 应用程序中与 IronPDF 一起使用。 我们将深入探讨 Polly 的各个方面,解释断路器模式的机制,讨论舱壁隔离和超时,并展示如何以受控、线程安全的方式处理特定异常或失败服务的失败响应。 Polly 策略 瞬态故障经常发生在您的应用程序尝试通过 HTTP 请求连接到 Web 服务、数据库或其他外部资源时。 这些故障,如网络故障、临时连接问题或超时,通常是短暂的,并会在短时间内自我纠正。 Polly 通过应用不同的策略和表达策略来管理这些瞬态故障,如重试策略、高级断路器策略、超时策略、回退策略和舱壁隔离策略。 重试策略 重试策略使用重试逻辑自动重试失败的并发请求。 它可以配置为永远重试或自动重试一定次数,并且可以在重试之间等待设定的时间间隔或使用指数退避。 断路器 断路器策略使您的系统支持在配置的失败请求阈值后尝试特定服务的取消令牌。 断路器策略类似于混沌工程或船只关闭防水门以局部化损坏:一个故障不会让整艘船沉没。 超时策略 超时策略强制执行特定 .NET 弹性代码可以执行的最长时间。 它有两种形式:乐观超时和悲观超时。 回退策略 回退策略用于在发生故障时提供替代值或行为。 当失败的服务不应停止整个过程时,此策略非常有用。 舱壁隔离 舱壁隔离用于限制对特定操作进行的并发请求的数量,从而限制套接字耗尽的可能性并保持受控的执行槽位数。 缓存策略 缓存策略缓存执行的成功响应,以便在同一执行再次调用时,Polly 可以返回分布式缓存值。 策略包装 允许我们将多个策略结合在一起,使其可以作为一个单元工作。 创建和配置策略 重试策略 重试策略很简单:当发生特定异常或故障时,Polly 将尝试再次执行底层委托。 您可以定义重试的次数、重试之间的时间间隔,或者使用指数退避策略,否则它将永远重试。 下面是一个例子: // Retry policy for handling HttpRequestException with exponential back-off var retryPolicy = Policy .Handle<HttpRequestException>() .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (exception, timeSpan, retryCount, context) => { // This is the OnRetry delegate, where you can log or monitor failed requests Console.WriteLine($"Retry {retryCount} after {timeSpan}. Exception: {exception.Message}"); }); // Retry policy for handling HttpRequestException with exponential back-off var retryPolicy = Policy .Handle<HttpRequestException>() .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (exception, timeSpan, retryCount, context) => { // This is the OnRetry delegate, where you can log or monitor failed requests Console.WriteLine($"Retry {retryCount} after {timeSpan}. Exception: {exception.Message}"); }); ' Retry policy for handling HttpRequestException with exponential back-off Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetryAsync(3, Function(retryAttempt) TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), Sub(exception, timeSpan, retryCount, context) Console.WriteLine($"Retry {retryCount} after {timeSpan}. Exception: {exception.Message}") End Sub) $vbLabelText $csharpLabel 断路器 Policy 断路器策略使 Polly 库监控故障,如果故障数量在指定时间内超过配置阈值,电路就会“断开”,并且在指定时间内阻止进一步的请求。这被称为“打开”状态。 在这段时间之后,电路进入“半开”状态,允许一些流量检查特定服务的健康状况。如果这些请求成功且没有故障发生,则电路关闭; 否则,它会再次打开。 // Circuit breaker policy to handle failing requests with open and half-open states var circuitBreakerPolicy = Policy .Handle<HttpRequestException>() .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1)); // Circuit breaker policy to handle failing requests with open and half-open states var circuitBreakerPolicy = Policy .Handle<HttpRequestException>() .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1)); ' Circuit breaker policy to handle failing requests with open and half-open states Dim circuitBreakerPolicy = Policy.Handle(Of HttpRequestException)().CircuitBreakerAsync(5, TimeSpan.FromMinutes(1)) $vbLabelText $csharpLabel 超时策略 超时策略处理服务未在合理时间范围内响应的场景。 Polly 提供两种类型的超时:乐观和悲观。 乐观超时在单独的线程上工作,并通过 CancellationToken 取消底层操作。 悲观超时会阻塞父线程,直到操作完成或超时时间过去。 // Timeout policy with a 30-second optimistic timeout var timeoutPolicy = Policy.TimeoutAsync(30); // 30 seconds // Timeout policy with a 30-second optimistic timeout var timeoutPolicy = Policy.TimeoutAsync(30); // 30 seconds ' Timeout policy with a 30-second optimistic timeout Dim timeoutPolicy = Policy.TimeoutAsync(30) ' 30 seconds $vbLabelText $csharpLabel 舱壁隔离 舱壁隔离用于限制对特定服务的并发操作数量。它提供了一种隔离故障的方法,防止它们连锁反应。 它还限制了我们对依赖项所施加的负载。 // Bulkhead isolation policy to limit concurrency and queue length var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, 20 queue slots // Bulkhead isolation policy to limit concurrency and queue length var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, 20 queue slots ' Bulkhead isolation policy to limit concurrency and queue length Dim bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20) ' 10 concurrent actions, 20 queue slots $vbLabelText $csharpLabel 回退策略 当所有其他方法均告失败时,回退策略在需要提供默认行为或替代值时非常有用。 // Fallback policy to provide a default result on failure var fallbackPolicy = Policy .Handle<Exception>() .FallbackAsync<FallbackResult>( FallbackResult.SomethingWentWrong, (exception, context) => { Console.WriteLine($"Fallback triggered due to: {exception.Message}"); return Task.CompletedTask; }); // Fallback policy to provide a default result on failure var fallbackPolicy = Policy .Handle<Exception>() .FallbackAsync<FallbackResult>( FallbackResult.SomethingWentWrong, (exception, context) => { Console.WriteLine($"Fallback triggered due to: {exception.Message}"); return Task.CompletedTask; }); ' Fallback policy to provide a default result on failure Dim fallbackPolicy = Policy.Handle(Of Exception)().FallbackAsync(Of FallbackResult)(FallbackResult.SomethingWentWrong, Function(exception, context) Console.WriteLine($"Fallback triggered due to: {exception.Message}") Return Task.CompletedTask End Function) $vbLabelText $csharpLabel 包装策略 多个策略可以灵活地组合在一起使用 PolicyWrap: // Combining multiple policies using PolicyWrap var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy); // Combining multiple policies using PolicyWrap var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy); ' Combining multiple policies using PolicyWrap Dim policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy) $vbLabelText $csharpLabel 开始 要开始使用 Polly 和 IronPDF,请确保您已安装 Visual Studio,并在 .NET Core 中创建一个新的控制台应用程序项目。 打开 Visual Studio 中的 NuGet 包管理器控制台并安装 Polly 和 IronPDF 包: Install-Package Polly Install-Package IronPdf 在 IronPDF 中使用 Polly 将 URL 转换为 PDF IronPDF 的一个显著功能是其 HTML 转 PDF 功能,确保布局和样式完好无损。 此功能将网页内容转为 PDF,非常适合报告、发票和文档。 它支持将 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"); } } 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"); } } Imports IronPdf Friend Class Program Shared Sub Main(ByVal args() As String) Dim renderer = New ChromePdfRenderer() ' 1. Convert HTML String to PDF Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>" Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent) pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf") ' 2. Convert HTML File to PDF Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath) pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf") ' 3. Convert URL to PDF Dim url = "http://ironpdf.com" ' Specify the URL Dim pdfFromUrl = renderer.RenderUrlAsPdf(url) pdfFromUrl.SaveAs("URLToPDF.pdf") End Sub End Class $vbLabelText $csharpLabel 让我们通过一个使用 Polly 和 IronPDF 的例子来转换 URL 为 PDF。 假设我们有一个由于瞬态故障而偶尔失败的 Web 服务,我们希望使用 Polly 优雅地处理这些故障。 首先,让我们在 Program.cs 文件中导入必要的命名空间: using System; using System.Threading.Tasks; using Polly; using Polly.Wrap; using IronPdf; using System; using System.Threading.Tasks; using Polly; using Polly.Wrap; using IronPdf; Imports System Imports System.Threading.Tasks Imports Polly Imports Polly.Wrap Imports IronPdf $vbLabelText $csharpLabel 接下来,我们将定义我们的策略。 在此示例中,我们将结合使用重试和断路器策略来处理故障: // Retry policy with exponential backoff var retryPolicy = Policy .Handle<Exception>() .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i)); // Circuit breaker policy to block requests after consecutive failures var circuitBreakerPolicy = Policy .Handle<Exception>() .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30)); // Retry policy with exponential backoff var retryPolicy = Policy .Handle<Exception>() .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i)); // Circuit breaker policy to block requests after consecutive failures var circuitBreakerPolicy = Policy .Handle<Exception>() .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30)); ' Retry policy with exponential backoff Dim retryPolicy = Policy.Handle(Of Exception)().WaitAndRetryAsync(3, Function(i) TimeSpan.FromSeconds(2 * i)) ' Circuit breaker policy to block requests after consecutive failures Dim circuitBreakerPolicy = Policy.Handle(Of Exception)().CircuitBreakerAsync(2, TimeSpan.FromSeconds(30)) $vbLabelText $csharpLabel retryPolicy 将使用指数退避策略重试失败的请求最多三次,重试之间等待 2 秒、4 秒和 8 秒。 circuitBreakerPolicy 将在 30 秒时间间隔内出现两个连续故障时打开电路。 现在,让我们定义我们的 IronPDF 代码,将 URL 转换为 PDF: var htmlToPdf = new ChromePdfRenderer(); var pdfBytes = await retryPolicy .WrapAsync(circuitBreakerPolicy) .ExecuteAsync(async () => { Console.WriteLine("Attempting to convert URL to PDF..."); var result = await htmlToPdf.RenderUrlAsPdfAsync("https://example.com"); Console.WriteLine("Conversion successful!"); return result; }); pdfBytes.SaveAs("output.pdf"); var htmlToPdf = new ChromePdfRenderer(); var pdfBytes = await retryPolicy .WrapAsync(circuitBreakerPolicy) .ExecuteAsync(async () => { Console.WriteLine("Attempting to convert URL to PDF..."); var result = await htmlToPdf.RenderUrlAsPdfAsync("https://example.com"); Console.WriteLine("Conversion successful!"); return result; }); pdfBytes.SaveAs("output.pdf"); Dim htmlToPdf = New ChromePdfRenderer() Dim pdfBytes = Await retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(Async Function() Console.WriteLine("Attempting to convert URL to PDF...") Dim result = Await htmlToPdf.RenderUrlAsPdfAsync("https://example.com") Console.WriteLine("Conversion successful!") Return result End Function) pdfBytes.SaveAs("output.pdf") $vbLabelText $csharpLabel 在上述示例代码中,我们使用 WrapAsync 方法包装我们的 retryPolicy 和 circuitBreakerPolicy。 这使我们能够对新请求按顺序应用多个策略。 ExecuteAsync 方法执行提供的委托,在此代码中是 IronPDF 的 RenderUrlAsPdfAsync 方法。 通过应用 Polly 策略,我们确保我们的代码具有适应瞬态故障的弹性。 如果请求失败,Polly 将根据重试策略自动重试。 如果连续故障的数量超过预配置的阈值,则断路器策略将打开电路,防止在指定时间内进一步的请求。 Polly 策略的测试用例 为了测试我们的 Polly 策略的有效性,让我们模拟一些失败的请求。 将 URL 修改为一个不存在的端点并添加几个测试用例: var testUrls = new[] { "https://ironpdf.com", "https://notexistingdomain.com/", "http://httpbin.org/delay/120" }; foreach (var url in testUrls) { try { var pdfBytes = await retryPolicy .WrapAsync(circuitBreakerPolicy) .ExecuteAsync(() => htmlToPdf.RenderUrlAsPdfAsync(url)); pdfBytes.SaveAs($"{Guid.NewGuid()}.pdf"); Console.WriteLine($"Successfully converted {url} to PDF."); } catch (Exception ex) { Console.WriteLine($"Failed to convert {url} to PDF: {ex.Message}"); } } var testUrls = new[] { "https://ironpdf.com", "https://notexistingdomain.com/", "http://httpbin.org/delay/120" }; foreach (var url in testUrls) { try { var pdfBytes = await retryPolicy .WrapAsync(circuitBreakerPolicy) .ExecuteAsync(() => htmlToPdf.RenderUrlAsPdfAsync(url)); pdfBytes.SaveAs($"{Guid.NewGuid()}.pdf"); Console.WriteLine($"Successfully converted {url} to PDF."); } catch (Exception ex) { Console.WriteLine($"Failed to convert {url} to PDF: {ex.Message}"); } } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel 在上述代码中,我们遍历一组测试 URL 并尝试将每一个转换为 PDF。 如果请求失败,异常将被捕获,并在控制台中显示相应的信息。 .NET Core Polly(开发人员如何使用):图 1 - URL 到 PDF 输出 结论 Polly 是一个功能强大且灵活的库,用于在 .NET Core 应用程序中实现弹性和瞬态故障处理。 通过结合重试和断路器等策略,开发人员可以构建稳健和容错的系统,优雅地处理故障。 在本教程中,我们探索了如何使用 Polly 和 IronPDF 转换 URL 为 PDF。 我们学习了如何定义和应用 Polly 策略,包括重试和断路器。 我们还用不同的 URL 测试了我们的策略。 我们还可以将其用于将 HTML 转换为 PDF。 IronPDF 提供免费试用,许可证以具有竞争力的价格起售,使您能够在项目中利用其功能。 常见问题解答 什么是 Polly,它如何增强 .NET Core 的弹性? Polly 是一个为弹性和瞬态故障处理而设计的 .NET 库,特别适用于 ASP.NET Core 应用。它通过提供重试、断路器、超时、隔舱隔离和回退等策略来增强弹性,确保系统稳健且容错。 如何在 .NET Core 中使用 Polly 来实现重试策略? 在 .NET Core 中,可以使用 Polly 来实现重试策略,通过配置它自动重试失败的请求。可以通过设置重试次数和尝试之间的时间间隔来有效管理瞬态故障。 断路器策略如何防止 .NET 应用中的级联故障? Polly 中的断路器策略通过监控故障并在达到失败阈值时打开电路来阻止请求,从而防止级联故障。这会停止进一步的请求,直到电路重置,允许系统恢复后再接受新请求。 隔舱隔离在管理资源耗尽中扮演什么角色? Polly 中的隔舱隔离限制对服务的并发请求数量,通过控制执行位置来防止资源耗尽。此策略有助于包含故障,并确保.NET Core应用中的资源管理效率。 Polly的超时策略如何提高应用程序的响应能力? Polly 的超时策略强制执行操作的最大执行时间,这有助于在服务没有及时响应时进行管理。通过设置乐观或悲观的超时,开发人员可以确保应用程序保持响应。 Polly 能否用于增强 URL 到 PDF 转换的可靠性? 是的,Polly 可以通过将其重试和断路器策略与 PDF 生成工具集成来增强 URL 到 PDF 转换的可靠性。这确保了转换过程能够抵御瞬态故障,保持可靠性。 Polly 中的回退策略如何确保服务优雅降级? Polly 中的回退策略在服务失败时提供替代响应或行为。这有助于确保故障不会使整个应用程序停滞,从而允许优雅的降级和继续操作。 如何在 .NET 应用程序中组合多个 Polly 策略? 在 .NET 应用程序中,可以使用策略包装组合多个 Polly 策略。这让开发人员能够一起执行不同的弹性策略,实现更全面和灵活的故障处理方法。 通过将 Polly 与 IronPDF 集成如何处理 PDF 生成中的瞬态故障? 通过将 Polly 与 IronPDF 集成,开发人员可以通过重试和断路器等策略在 PDF 生成期间处理瞬态故障。这种集成确保了 PDF 生成的稳定性和可靠性,尽管有时服务中断。 在 .NET Core 中使用 Polly 时的一些常见故障排除策略是什么? 常见的故障排除策略包括验证策略配置,例如重试间隔和断路器阈值,以及用不同场景测试策略,以确保故障和系统弹性的正确处理。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已更新九月 4, 2025 RandomNumberGenerator C# 使用 RandomNumberGenerator C# 类可以帮助将您的 PDF 生成和编辑项目提升到一个新的高度。 阅读更多 已更新九月 4, 2025 C# String Equals(开发者用法) 与强大的 PDF 库 IronPDF 结合使用,切换模式匹配允许您为文档处理构建更智能、更简洁的逻辑。 阅读更多 已更新八月 5, 2025 C# Switch 模式匹配(开发者用法) 与强大的 PDF 库 IronPDF 结合使用,切换模式匹配允许您为文档处理构建更智能、更简洁的逻辑。 阅读更多 C# 分割字符串(开发者如何使用)Blazor 与 MVC(开发者如何使...
已更新九月 4, 2025 RandomNumberGenerator C# 使用 RandomNumberGenerator C# 类可以帮助将您的 PDF 生成和编辑项目提升到一个新的高度。 阅读更多