gRPC-Verbindungsfehler in IronPDF Azure-Containern

This article was translated from English: Does it need improvement?
Translated
View the article in English

Wenn IronPDF in Docker-Containern auf Azure Container Instances oder Azure App Service bereitgestellt wird, kann die gRPC-Kommunikation zwischen der Anwendung und der IronPDF-Engine fehlschlagen. Dies passiert am häufigsten, nachdem ein Container in den Ruhezustand wechselt oder neu gestartet wird, oder wenn der gRPC-Kanal nicht mit einer Wiederholungslogik konfiguriert ist.

Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
Status(StatusCode="Unknown", Detail="Stream removed")

Diese Fehler treten auf, weil Azure-Containerumgebungen Container während Leerlaufzeiten herunterfahren oder recyceln können. Ohne eine Wiederholungsrichtlinie auf dem gRPC-Kanal führt eine einzelne abgebrochene Verbindung dazu, dass der Aufruf sofort fehlschlägt, anstatt sich erneut zu verbinden. HTTP/2-Stream-Schließungen und plattformabhängige Kanalsetup-Ungleichheiten können ebenfalls diese Fehler verursachen.

Lösung

1. Setzen Sie die Container-Neustartrichtlinie auf Immer

Setzen Sie bei Azure Container Instances die Neustartrichtlinie auf Always. Bei Azure App Service verwenden Sie einen dedizierten Plan (Basic B1 oder höher) anstelle des Consumption-Plans, der auf Null skaliert und Container beendet. Für Arbeitslasten, die persistente Verbindungen erfordern, sind von Kubernetes verwaltete Container eine stabilere Option.

2. Konfigurieren Sie die gRPC-Wiederholungslogik

Wählen Sie den Ansatz, der zu Ihrem Ziel-Framework passt.

Für .NET Framework: verwenden Sie Grpc.Core.Channel mit einer JSON-Wiederholungsrichtlinie

using Grpc.Core;
using IronPdf.GrpcLayer;

string jsonString = @"
{
    ""methodConfig"": [
        {
            ""name"": [
                {
                    ""service"": ""ironpdfengineproto.IronPdfService""
                }
            ],
            ""retryPolicy"": {
                ""maxAttempts"": 5,
                ""initialBackoff"": ""1.0s"",
                ""maxBackoff"": ""30s"",
                ""backoffMultiplier"": 1.5,
                ""retryableStatusCodes"": [
                    ""UNAVAILABLE""
                ]
            }
        }
    ]
}";

var channel = new Channel("localhost:33350", ChannelCredentials.Insecure,
    new[]
    {
        new ChannelOption("grpc.service_config", jsonString)
    });

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
);
using Grpc.Core;
using IronPdf.GrpcLayer;

string jsonString = @"
{
    ""methodConfig"": [
        {
            ""name"": [
                {
                    ""service"": ""ironpdfengineproto.IronPdfService""
                }
            ],
            ""retryPolicy"": {
                ""maxAttempts"": 5,
                ""initialBackoff"": ""1.0s"",
                ""maxBackoff"": ""30s"",
                ""backoffMultiplier"": 1.5,
                ""retryableStatusCodes"": [
                    ""UNAVAILABLE""
                ]
            }
        }
    ]
}";

var channel = new Channel("localhost:33350", ChannelCredentials.Insecure,
    new[]
    {
        new ChannelOption("grpc.service_config", jsonString)
    });

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
);
Imports Grpc.Core
Imports IronPdf.GrpcLayer

Dim jsonString As String = "
{
    ""methodConfig"": [
        {
            ""name"": [
                {
                    ""service"": ""ironpdfengineproto.IronPdfService""
                }
            ],
            ""retryPolicy"": {
                ""maxAttempts"": 5,
                ""initialBackoff"": ""1.0s"",
                ""maxBackoff"": ""30s"",
                ""backoffMultiplier"": 1.5,
                ""retryableStatusCodes"": [
                    ""UNAVAILABLE""
                ]
            }
        }
    ]
}"

Dim channel = New Channel("localhost:33350", ChannelCredentials.Insecure,
    {
        New ChannelOption("grpc.service_config", jsonString)
    })

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
)
$vbLabelText   $csharpLabel

Für .NET Core / .NET 5+: verwenden Sie Grpc.Net.Client.GrpcChannel mit RetryPolicy

using Grpc.Net.Client;
using Grpc.Net.Client.Configuration;
using IronPdf.GrpcLayer;
using Grpc.Core;

var retryPolicy = new RetryPolicy
{
    MaxAttempts = 5,
    InitialBackoff = TimeSpan.FromSeconds(1),
    MaxBackoff = TimeSpan.FromSeconds(30),
    BackoffMultiplier = 1.5,
    RetryableStatusCodes = { StatusCode.Unavailable }
};

var methodConfig = new MethodConfig
{
    Names = { MethodName.Default },
    RetryPolicy = retryPolicy
};

var channel = GrpcChannel.ForAddress("http://localhost:33350", new GrpcChannelOptions
{
    ServiceConfig = new ServiceConfig { MethodConfigs = { methodConfig } }
});

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
);
using Grpc.Net.Client;
using Grpc.Net.Client.Configuration;
using IronPdf.GrpcLayer;
using Grpc.Core;

var retryPolicy = new RetryPolicy
{
    MaxAttempts = 5,
    InitialBackoff = TimeSpan.FromSeconds(1),
    MaxBackoff = TimeSpan.FromSeconds(30),
    BackoffMultiplier = 1.5,
    RetryableStatusCodes = { StatusCode.Unavailable }
};

var methodConfig = new MethodConfig
{
    Names = { MethodName.Default },
    RetryPolicy = retryPolicy
};

var channel = GrpcChannel.ForAddress("http://localhost:33350", new GrpcChannelOptions
{
    ServiceConfig = new ServiceConfig { MethodConfigs = { methodConfig } }
});

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
);
Imports Grpc.Net.Client
Imports Grpc.Net.Client.Configuration
Imports IronPdf.GrpcLayer
Imports Grpc.Core

Dim retryPolicy As New RetryPolicy With {
    .MaxAttempts = 5,
    .InitialBackoff = TimeSpan.FromSeconds(1),
    .MaxBackoff = TimeSpan.FromSeconds(30),
    .BackoffMultiplier = 1.5,
    .RetryableStatusCodes = {StatusCode.Unavailable}
}

Dim methodConfig As New MethodConfig With {
    .Names = {MethodName.Default},
    .RetryPolicy = retryPolicy
}

Dim channel As GrpcChannel = GrpcChannel.ForAddress("http://localhost:33350", New GrpcChannelOptions With {
    .ServiceConfig = New ServiceConfig With {.MethodConfigs = {methodConfig}}
})

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.WithCustomChannel(channel)
)
$vbLabelText   $csharpLabel

3. Nutzen Sie RemoteServer für einfachere Konfiguration

Wenn Sie keine benutzerdefinierten Kanaloptionen benötigen, bietet RemoteServer integrierte Wiederholungsunterstützung und ist der empfohlene Ausgangspunkt für die meisten Azure-Containerbereitstellungen. Verwenden Sie dies anstelle von .Docker(), wenn sich die Engine- und Anwendung-Container nicht im selben lokalen Netzwerk befinden. Für die vollständige Verbindungskonfigurationsreferenz siehe den IronPDF Engine Guide.

IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.RemoteServer("http://your-container-host:33350")
);
IronPdf.Installation.ConnectToIronPdfHost(
    IronPdfConnectionConfiguration.RemoteServer("http://your-container-host:33350")
);
Imports IronPdf

IronPdf.Installation.ConnectToIronPdfHost( _
    IronPdfConnectionConfiguration.RemoteServer("http://your-container-host:33350") _
)
$vbLabelText   $csharpLabel

4. Verhindern Sie das Herunterfahren der Engine zwischen Anfragen

Standardmäßig fährt IronPDF seine Engine zwischen Anfragen herunter. Indem Sie SkipShutdown auf true setzen, bleibt der Engine-Prozess aktiv, wodurch die Wiederverbindungsüberlastung vermieden und die Wahrscheinlichkeit von Verbindungsfehlern in langlaufenden Containern verringert wird.

IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = True
$vbLabelText   $csharpLabel

Debug-Tipps

Um detaillierte gRPC-Diagnoseausgaben zu erhalten, setzen Sie die folgenden Umgebungsvariablen in Ihrer Dockerfile oder Containerkonfiguration:

ENV GRPC_TRACE=all
ENV GRPC_VERBOSITY=DEBUG

Prüfen Sie cef.log und IronSoftware.log für zusätzliche Details zu Verbindungsfehlern. Um zu erfahren, wie Sie Protokolldateien von Azure abrufen, siehe Azure-L Protokolldateien.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 20,088,359 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronPdf
Führen Sie eine Probe aus Sehen Sie zu, wie Ihr HTML-Code in eine PDF-Datei umgewandelt wird.