푸터 콘텐츠로 바로가기
.NET 도움말

Polly 재시도 (개발자에게 어떻게 작동하는가)

일시적 오류, 타임아웃, 예외를 우아하게 처리하는 것은 견고하고 탄력적인 애플리케이션을 구축하는 데 중요합니다. Polly는 탄력성과 일시적 오류 처리 기능을 제공하는 인기 있는 .NET 라이브러리입니다. 그 많은 기능 중 '재시도'는 가장 널리 사용되는 정책 중 하나입니다.

이 문서에서는 C#에서의 Polly의 재시도 정책에 대해 살펴보고, 그 사용법 및 구성 옵션을 탐색하며 실용적인 코드 예제를 제공합니다. 또한, Polly Retry 시도와 함께 PDF 생성 용 IronPDF 라이브러리를 사용하여 양식 요청 결과의 PDF를 생성합니다.

Polly Retry란 무엇인가요?

Polly Retry는 Polly 라이브러리에서 제공하는 정책으로, 개발자가 오류 또는 일시적 오류로 인해 실패할 수 있는 작업을 자동으로 재시도하도록 설정할 수 있게 합니다. 일시적 오류는 네트워크 문제, 서비스 불가 상태 또는 기타 일시적 문제로 발생하는 일시적인 오류입니다.

Polly의 재시도 정책을 사용하면, 최대 재시도 횟수, 여러 번의 재시도 사이의 지연 시간, 실패한 요청을 다시 시도하는 조건을 포함하여 작업을 재시도하는 규칙을 정의할 수 있습니다. 이것은 충돌하거나 최종 사용자에게 혼란을 야기하지 않고 일시적인 실패에서 복구할 수 있는 탄력적인 애플리케이션을 구축하는 데 도움이 됩니다.

Polly Retry 시작하기

코드 예제로 들어가기 전, C# 프로젝트에서 Polly를 설치하고 구성하는 기본 방법을 설정해 봅시다.

Polly 설치

다음 명령을 사용하여 NuGet 패키지 관리자 콘솔을 통해 Polly를 설치할 수 있습니다:

Install-Package Polly

.NET CLI를 통해:

dotnet add package Polly

Polly using 문 추가

C# 파일에서 Polly 네임스페이스를 포함합니다:

using Polly;
using Polly;
Imports Polly
$vbLabelText   $csharpLabel

기본 재시도 정책 예제

먼저 원격 서비스에서 데이터를 가져오는 작업을 시뮬레이션 하는 작업을 재시도하는 간단한 예제를 시작해 봅시다. 최대 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");
        }
    }
}
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");
        }
    }
}
Imports System
Imports System.Net.Http
Imports Polly

Namespace PollyRetryExample
	Public Class Program
		Public Shared Sub Main(ByVal args() As String)
			' Define a retry policy that handles HttpRequestException with a maximum of 3 retries
			Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetry(3, Function(retryAttempt) TimeSpan.FromSeconds(2), Sub(exception, timeSpan, retryCount, context)
				Console.WriteLine("Retry {0} due to {1}", retryCount, exception.Message)
			End Sub)

			Try
				' Execute the action within the context of the retry policy
				retryPolicy.Execute(Sub()
					FetchDataFromRemoteService()
				End Sub)
			Catch ex As Exception
				Console.WriteLine("Failed after 3 retries: {0}", ex.Message)
			End Try
		End Sub

		' Simulate fetching data that throws HttpRequestException
		Public Shared Sub FetchDataFromRemoteService()
			Throw New HttpRequestException("Failed to fetch data from remote service")
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

이 예시에서는 다음과 같습니다.

  • Handle<HttpRequestException>()는 우리가 HttpRequestException를 처리하고 발생할 경우 작업을 재시도하기를 원한다는 것을 지정합니다.
  • WaitAndRetry()는 3회의 재시도와 재시도 사이에 2초의 고정 지연 시간을 가지는 재시도 정책을 구성합니다 (지정된 최대 기간).
  • onRetry 대리자가 재시도가 발생할 때 메시지를 기록합니다.

Polly 재시도 (개발자를 위한 작동 방식): 그림 1

고급 재시도 정책 설정

지수적 백오프

지수 백오프(exponential backoff)는 요청 및 재시도 사이의 지연이 지수적으로 증가하는 인기 있는 재시도 전략입니다. 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}");
        });
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}");
        });
Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetry(retryCount:= 3, sleepDurationProvider:= Function(attempt) TimeSpan.FromSeconds(Math.Pow(2, attempt)), onRetry:= Sub(exception, timeSpan, retryCount, context)
	Console.WriteLine($"Retry {retryCount} due to {exception.Message}")
End Sub)
$vbLabelText   $csharpLabel

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);
// 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);
' Define a circuit breaker policy
Dim circuitBreakerPolicy = Policy.Handle(Of HttpRequestException)().CircuitBreaker(exceptionsAllowedBeforeBreaking:= 3, durationOfBreak:= TimeSpan.FromSeconds(30), onBreak:= Sub(ex, breakDelay)
			Console.WriteLine($"Circuit broken due to {ex.Message}. Retry after {breakDelay.TotalSeconds} seconds.")
End Sub, onReset:= Sub()
			Console.WriteLine("Circuit reset.")
End Sub)

' Define a retry policy
Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetry(retryCount:= 3, sleepDurationProvider:= Function(attempt) TimeSpan.FromSeconds(2), onRetry:= Sub(exception, timeSpan, retryCount, context)
	Console.WriteLine($"Retry {retryCount} due to {exception.Message}")
End Sub)

' Combine both policies into a single policy wrap
Dim policyWrap = Policy.Wrap(circuitBreakerPolicy, retryPolicy)
$vbLabelText   $csharpLabel

이 예시에서는 다음과 같습니다.

  • CircuitBreaker()는 3번의 예외 후에 회로 차단이 되고 30초 동안 열린 상태로 유지되는 회로 차단기 정책을 정의합니다.
  • Policy.Wrap()는 회로 차단기와 재시도 정책을 단일 정책으로 결합합니다.

Polly 재시도 (개발자를 위한 작동 방식): 그림 3

IronPDF 소개

IronPDF C# PDF 라이브러리 개요는 개발자가 .NET 애플리케이션 내에서 PDF 문서를 생성, 편집 및 조작할 수 있게 하는 강력한 C# 라이브러리입니다. 청구서, 보고서, 기타 유형의 PDF 문서를 생성할 필요가 있는지 여부에 상관없이 IronPDF는 프로세스를 간소화하는 직관적인 API를 제공합니다.

IronPDF를 사용하면 HTML, CSS 및 ASP.NET 웹 페이지에 이르기까지 쉽게 PDF로 변환할 수 있어 다양한 애플리케이션에 유연한 도구입니다. 또한 PDF에 텍스트, 이미지 및 대화형 요소를 추가하고 암호화 및 디지털 서명으로 보안을 강화하는 등의 고급 기능을 제공합니다.

IronPDF는 HTML to 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");
    }
}
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

IronPDF와 Polly를 사용한 재시도

IronPDF와 작업할 때 PDF를 생성하기 전에 외부 소스에서 데이터를 가져오거나 복잡한 작업을 수행해야 하는 시나리오가 있을 수 있습니다.

이 경우 PDF 생성 실패로 이어질 수 있는 일시적인 오류나 일시적인 문제가 발생할 수 있습니다. 이러한 일시적인 오류를 우아하게 처리하려면 IronPDF와 함께 Polly Retry를 사용할 수 있습니다.

IronPDF와 Polly 설치

시작하기 전에 프로젝트에 IronPDF NuGet 패키지를 설치해야 합니다.

Install-Package IronPdf

IronPDF와 함께 Polly Retry 사용하기

IronPDF를 사용하여 PDF를 생성할 때 일시적인 오류를 처리하기 위해 Polly Retry를 사용하는 예를 살펴보겠습니다. 다음 예제에서는 외부 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);
        }
    }
}
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);
        }
    }
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
Imports IronPdf
Imports Polly

Namespace IronPdfWithPollyRetry
	Public Class Program
		Public Shared Async Function Main(ByVal args() As String) As Task
			' Define a retry policy with async capability
			Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetryAsync(3, Function(retryAttempt) TimeSpan.FromSeconds(2), Sub(exception, timeSpan, retryCount, context)
				Console.WriteLine("Retry " & retryCount & " due to " & exception.Message)
			End Sub)

			' Execute the retry policy asynchronously
			Dim pdf = Await retryPolicy.ExecuteAsync(Async Function()
				Dim data = Await FetchDataFromExternalApiAsync() ' Fetch data from an external source
				Return GeneratePdfFromData(data) ' Generate PDF using fetched data
			End Function)

			pdf.SaveAs("GeneratedDocument.pdf")
		End Function

		' Simulate fetching data from an external API
		Private Shared Async Function FetchDataFromExternalApiAsync() As Task(Of String)
			Await Task.Delay(100) ' Simulate delay
			Throw New HttpRequestException("Failed to fetch data from external API")
		End Function

		' Generate PDF using IronPDF based on the fetched data
		Private Shared Function GeneratePdfFromData(ByVal data As String) As PdfDocument
			Dim htmlContent = "<html><body><h1>Data: " & data & "</h1></body></html>"
			Dim renderer = New ChromePdfRenderer()
			Return renderer.RenderHtmlAsPdf(htmlContent)
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

이 C# 코드 예제는 IronPDF로 PDF 문서를 생성하기 위해 재시도 정책을 구현하는 Polly 라이브러리 사용 방법을 보여줍니다. The 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를 위한 체험판 라이선스도 제공하고 가격은 $799 USD부터 시작합니다.

IronPDF를 사용한 HTML에서 PDF로 변환에 대해 알아보려면 다음 IronPDF HTML에서 PDF로 변환 튜토리얼을 방문하십시오.

자주 묻는 질문

C#에서 Polly 재시도란 무엇인가요?

Polly 재시도는 C#의 Polly 라이브러리의 기능으로, 네트워크 글리치나 서비스 이용 불가와 같은 일시적인 문제로 실패한 작업을 자동으로 재시도할 수 있게 해줍니다. 이는 일시적인 오류를 우아하게 처리하여 복원력 있는 애플리케이션을 구축하는 데 도움이 됩니다.

Polly를 사용하여 기본 재시도 정책을 어떻게 구현할 수 있나요?

Polly에서 HttpRequestException과 같은 예외를 처리하고 최대 세 번 재시도하며 각 시도 사이에 2초의 고정 지연을 설정하여 기본 재시도 정책을 구현할 수 있습니다.

Polly에서 지수 백오프의 중요성은 무엇인가요?

Polly의 지수 백오프는 재시도 사이의 지연을 지수적으로 증가시켜 실패 중의 서비스 부담을 줄이는 데 사용됩니다. 이는 Polly의 WaitAndRetry 메소드를 사용하여 지수 성장에 기반하여 지연을 계산함으로써 구현할 수 있습니다.

C# 프로젝트에 Polly를 어떻게 설치하나요?

NuGet 패키지 관리자 콘솔에서 Install-Package Polly 명령을 사용하거나 .NET CLI를 통해 dotnet add package Polly를 사용하여 C# 프로젝트에 Polly를 설치할 수 있습니다.

Polly의 재시도 정책을 다른 복원력 전략과 결합할 수 있나요?

네, Polly는 재시도 정책을 서킷 브레이커와 같은 다른 복원력 전략과 결합할 수 있도록 하며, Policy.Wrap 메소드를 사용하여 애플리케이션 복원력을 향상시키고 서비스가 지속적으로 실패할 때 반복적인 재시도를 방지할 수 있습니다.

C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?

IronPDF의 RenderHtmlAsPdf와 같은 메소드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. IronPDF는 HTML 파일과 웹 페이지, CSS를 포함하여 PDF 형식으로 변환하는 것을 지원합니다.

C# 애플리케이션에서 Polly의 재시도 정책이 중요한 이유는 무엇인가요?

Polly의 재시도 정책은 C# 애플리케이션에서 일시적인 오류를 처리하고 견고성을 보장하며, 시스템이 일시적인 실패로 인해 충돌하지 않고 복구할 수 있도록 하여 사용자 경험을 향상시키는 데 필수적입니다.

PDF 생성 프로세스에서 재시도 전략을 어떻게 구현할 수 있나요?

PDF를 생성할 때, 일시적인 오류를 처리하기 위해 Polly를 사용하여 재시도 전략을 구현할 수 있습니다. Polly의 재시도 기능을 IronPDF와 통합하여 일시적인 네트워크나 서비스 문제 발생 시 PDF 작업을 여러 번 시도할 수 있습니다.

C# PDF 라이브러리인 IronPDF를 어떻게 설치하나요?

IronPDF는 NuGet 패키지 관리자를 통해 Install-Package IronPdf 명령을 사용하여 설치할 수 있으며, C# 애플리케이션 내에서 PDF 문서를 생성, 편집 및 조작할 수 있게 해줍니다.

IronPDF를 사용하여 PDF를 생성할 때의 장점은 무엇인가요?

IronPDF는 .NET 애플리케이션에서 PDF 문서를 생성하고 조작하기 위한 강력한 기능을 제공합니다. HTML, CSS, 웹 페이지를 PDF로 변환하고, 텍스트와 이미지를 추가하며, 암호화를 통해 문서를 보호하는 기능을 지원합니다.

제이콥 멜러, 팀 아이언 최고기술책임자
최고기술책임자

제이콥 멜러는 Iron Software의 최고 기술 책임자(CTO)이자 C# PDF 기술을 개척한 선구적인 엔지니어입니다. Iron Software의 핵심 코드베이스를 최초로 개발한 그는 창립 초기부터 회사의 제품 아키텍처를 설계해 왔으며, CEO인 캐머런 리밍턴과 함께 회사를 NASA, 테슬라, 그리고 전 세계 정부 기관에 서비스를 제공하는 50명 이상의 직원을 보유한 기업으로 성장시켰습니다.

제이콥은 맨체스터 대학교에서 토목공학 학사 학위(BEng)를 최우등으로 취득했습니다(1998~2001). 1999년 런던에서 첫 소프트웨어 회사를 설립하고 2005년 첫 .NET 컴포넌트를 개발한 후, 마이크로소프트 생태계 전반에 걸쳐 복잡한 문제를 해결하는 데 전문성을 발휘해 왔습니다.

그의 대표 제품인 IronPDF 및 Iron Suite .NET 라이브러리는 전 세계적으로 3천만 건 이상의 NuGet 설치 수를 기록했으며, 그의 핵심 코드는 전 세계 개발자들이 사용하는 다양한 도구에 지속적으로 활용되고 있습니다. 25년의 실무 경험과 41년의 코딩 전문성을 바탕으로, 제이콥은 차세대 기술 리더들을 양성하는 동시에 기업 수준의 C#, Java, Python PDF 기술 혁신을 주도하는 데 주력하고 있습니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해