.NET 幫助

.NET Core Polly(如何為開發者運作)

Polly 是一個 .NET 韌性策略和瞬態故障處理庫,允許開發者表達音韌政策,如重試策略、斷路器、超時、艙壁隔離策略和後備策略。 Polly 針對 ASP.NET Core,使其成為 .NET Core 韌性的重要工具。 Polly 是執行緒安全的,並支援處理多個並發請求以獲得成功的回應。

本教程將提供有關暫態故障處理 .NET 庫 Polly 的更多詳細信息,以及如何在 ASP.NET Core 應用程式中使用IronPDF。 我們將深入探討 Polly 的每個方面,解釋斷路器模式的機制,討論隔艙隔離和超時,並展示如何以受控、線程安全的方式處理特定異常或失敗服務的失敗響應。

Polly 政策

當您的應用程式嘗試透過 HTTP 請求、資料庫或其他外部資源連接到網頁服務時,經常會發生暫時性故障。 這些故障,如網絡故障、臨時連接問題或超時,都是暫時的,通常在短時間內自行糾正。

Polly 通過應用不同的策略來管理這些瞬態故障,並表達出重試策略、高級斷路器策略、超時策略、回退策略和隔艙隔離策略等政策。

重试策略

重試策略使用重試邏輯自動重試失敗的並發請求。 它可以配置为无限重试或自动重试一定次数,并可以在重试之间等待设定的时间间隔,或者使用指数退避。

斷路器

斷路器策略讓您的系統在預設的失敗請求閾值後,支持使用取消權杖嘗試特定的服務。 斷路器策略類似於混沌工程或船隻關閉密閉門以局部化損害:一個故障不會讓整艘船沉沒。

超時政策

超時策略強制執行特定 .NET 韌性代碼的最大執行時間。 它有兩種風格:樂觀超時和悲觀超時。

後備政策

回退策略被用來在失敗的情況下提供替代值或行為。 此政策可在一個服務失敗時不應中止整個過程時派上用場。

隔離牆隔離

艙壁隔離用來限制對特定操作的並發請求數量,從而限制套接字耗盡的可能性,並維持受控的執行槽位數量。

快取策略

快取策略會快取執行的成功響應,因此如果再次調用相同的執行,Polly可以返回分散式快取的值。

政策包裝

允許我們將多個策略一起打包,使它們可以作為一個單元工作。

建立和配置政策

重试策略

重試策略很簡單:當發生特定異常或錯誤時,Polly 會嘗試再次執行底層委託。 您可以設定重試的次數、重試之間的時間間隔,或使用指數退避策略,否則將永遠重試。 這是個例子:

//extension method
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
    });
//extension method
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
    });
'extension method
Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetryAsync(3, Function(retryAttempt) TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), Sub(exception, timeSpan, retryCount, context)
End Sub)
$vbLabelText   $csharpLabel

熔斷器策略

斷路器策略使 Polly 庫能夠監控故障,如果故障數量在指定期間內超過設定的閾值,電路就會「斷開」,並且在指定時間內阻止進一步的請求。這稱為「打開」狀態。 在這之後,電路進入「半開」狀態,允許一些流量檢查特定服務的健康狀況。如果這些請求成功且沒有發生故障,電路會關閉; 否則,它會再次開啟。

var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));
var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));
Dim circuitBreakerPolicy = Policy.Handle(Of HttpRequestException)().CircuitBreakerAsync(5, TimeSpan.FromMinutes(1))
$vbLabelText   $csharpLabel

超時政策

超時策略處理服務未在合理時間範圍內做出回應的情況。 Polly 提供兩種類型的超時:樂觀超時和悲觀超時。 樂觀的超時操作在單獨的執行緒上運行,並通過CancellationToken取消基礎操作。 悲觀超時會阻止父執行緒,直到操作完成或超時期限結束。

var timeoutPolicy = Policy.TimeoutAsync(30); // Optimistic timeout of 30 seconds
var timeoutPolicy = Policy.TimeoutAsync(30); // Optimistic timeout of 30 seconds
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

隔離牆隔離

隔艙隔離用於限制對特定服務的並發操作數量。它提供了一種隔離故障並防止其級聯的方法。 它還限制了我們對相依項目造成的負擔。

var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, queue 20 additional actions
var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, queue 20 additional actions
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

後備政策

當所有方法都失效時,回退策略可用於提供預設行為或替代值。

var fallbackPolicy = Policy
    .Handle<Exception>()
    .FallbackAsync<FallbackResult>(FallbackResult.SomethingWentWrong);
var fallbackPolicy = Policy
    .Handle<Exception>()
    .FallbackAsync<FallbackResult>(FallbackResult.SomethingWentWrong);
Dim fallbackPolicy = Policy.Handle(Of Exception)().FallbackAsync(Of FallbackResult)(FallbackResult.SomethingWentWrong)
$vbLabelText   $csharpLabel

封裝策略

多個策略可以透過使用PolicyWrap靈活地結合在一起:

var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy);
var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

入門

要開始使用 Polly 與 IronPDF,請確保已安裝 Visual Studio,並在 .NET Core 中建立一個新的主控台應用程式專案。 在 Visual Studio 中打開 NuGet 封裝管理控制台,並安裝 PollyIronPdf 封裝:

:InstallCmd Install-Package Polly
:InstallCmd Install-Package Polly
SHELL
:ProductInstall Install-Package IronPdf
:ProductInstall Install-Package IronPdf
SHELL

使用 Polly 與 IronPDF 將 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 的示例來進行說明。 假設我們有一個網絡服務,由於暫時性故障偶爾會失敗,我們希望使用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

接下來,我們將定義我們的政策。 在此範例中,我們將使用重試和斷路器策略的結合來處理故障:

var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i));

var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));
var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i));

var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));
Dim retryPolicy = Policy.Handle(Of Exception)().WaitAndRetryAsync(3, Function(i) TimeSpan.FromSeconds(2 * i))

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(() =>
    {
        Console.WriteLine("Attempting to convert URL to PDF...");
        var result = 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(() =>
    {
        Console.WriteLine("Attempting to convert URL to PDF...");
        var result = 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(Function()
		Console.WriteLine("Attempting to convert URL to PDF...")
		Dim result = htmlToPdf.RenderUrlAsPdfAsync("https://example.com")
		Console.WriteLine("Conversion successful!")
		Return result
End Function)

pdfBytes.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

在上面的範例程式碼中,我們使用WrapAsync方法包裝retryPolicycircuitBreakerPolicy。 這使我們能夠按順序對新請求應用多個策略。 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 - PDF輸出網址

結論

Polly 是一個強大且靈活的庫,用於在 .NET Core 應用程式中實現彈性和暫時性故障處理。 通過結合重試和斷路器等策略,開發人員可以建立健壯且容錯的系統,優雅地處理故障。

在本教程中,我們探討了如何使用 Polly 與 IronPDF 將 URL 轉換為 PDF。 我們學習了如何定義和應用Polly策略,包括重試和斷路器。 我們也使用不同的網址測試了我們的政策。 我們也可以將其用於將 HTML 轉換為 PDF

IronPDF提供免費試用,且授權起價具有競爭力,讓您能在項目中利用其功能。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# 字串分割(開發者應如何操作)
下一個 >
Blazor 與 MVC(如何為開發人員運作)