gRPC-Verbindungsfehler in IronPDF Azure-Containern
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)
)
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)
)
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") _
)
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
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.

