# 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.
```txt
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
```
```txt
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**
```csharp
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)
);
```
**Für .NET Core / .NET 5+: verwenden Sie `Grpc.Net.Client.GrpcChannel` mit `RetryPolicy`**
```csharp
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)
);
```
### 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](/get-started/ironpdfengine/).
```csharp
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.
```csharp
IronPdf.Installation.SkipShutdown = true;
```
## Debug-Tipps
Um detaillierte gRPC-Diagnoseausgaben zu erhalten, setzen Sie die folgenden Umgebungsvariablen in Ihrer Dockerfile oder Containerkonfiguration:
```dockerfile
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](/troubleshooting/azure-log-files/).
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")
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
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
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)
);
ImportsGrpc.Net.ClientImportsGrpc.Net.Client.ConfigurationImportsIronPdf.GrpcLayerImportsGrpc.CoreDim retryPolicy As New RetryPolicyWith { .MaxAttempts = 5, .InitialBackoff = TimeSpan.FromSeconds(1), .MaxBackoff = TimeSpan.FromSeconds(30), .BackoffMultiplier = 1.5, .RetryableStatusCodes = {StatusCode.Unavailable}}Dim methodConfig As New MethodConfigWith { .Names = {MethodName.Default}, .RetryPolicy = retryPolicy}Dim channel AsGrpcChannel = GrpcChannel.ForAddress("http://localhost:33350", New GrpcChannelOptionsWith { .ServiceConfig = New ServiceConfigWith {.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.
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
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=allENV GRPC_VERBOSITY=DEBUG
ENV GRPC_TRACE=all
ENV GRPC_VERBOSITY=DEBUG
Text
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 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 Handbücher.