Erreurs de connexion gRPC dans les conteneurs Azure d'IronPDF
Lorsque IronPDF est déployé dans des conteneurs Docker sur Azure Container Instances ou Azure App Service, la communication gRPC entre l'application et le moteur IronPDF peut échouer. Cela survient le plus souvent après qu'un conteneur soit inactif ou redémarré, ou lorsque le canal gRPC n'est pas configuré avec une logique de nouvelle tentative.
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
Status(StatusCode="Unknown", Detail="Stream removed")
Ces erreurs se produisent parce que les environnements de conteneurs Azure peuvent arrêter ou recycler les conteneurs durant les périodes d'inactivité. Sans une politique de nouvelle tentative sur le canal gRPC, une seule connexion interrompue entraîne l'échec immédiat de l'appel au lieu de se reconnecter. La fermeture de flux HTTP/2 et les incompatibilités de configuration de canal spécifiques à la plateforme peuvent également produire ces erreurs.
Solution
1. Définir la politique de redémarrage du conteneur sur Toujours
Sur Azure Container Instances, définissez la politique de redémarrage sur Always. Sur Azure App Service, utilisez un plan dédié (Basic B1 ou supérieur) plutôt que le plan Consumption, qui s'adapte à zéro et termine les conteneurs. Pour les charges de travail nécessitant des connexions persistantes, les conteneurs gérés par Kubernetes sont une option plus stable.
2. Configurer la logique de nouvelle tentative gRPC
Choisissez l'approche qui correspond à votre framework cible.
Pour .NET Framework : utilisez Grpc.Core.Channel avec une politique de nouvelle tentative JSON
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)
)
Pour .NET Core / .NET 5+ : utilisez Grpc.Net.Client.GrpcChannel avec 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. Utiliser RemoteServer pour une configuration plus simple
Si vous n'avez pas besoin d'options de canal personnalisées, RemoteServer offre un support de nouvelle tentative intégré et constitue le point de départ recommandé pour la plupart des déploiements de conteneurs Azure. Utilisez ceci au lieu de .Docker() lorsque les conteneurs du moteur et de l'application ne sont pas sur le même réseau local. Pour la référence complète de la configuration de la connexion, consultez le guide du moteur IronPDF.
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. Empêcher l'arrêt du moteur entre les requêtes
Par défaut, IronPDF éteint son moteur entre les requêtes. Définir SkipShutdown sur true maintient le processus du moteur actif, ce qui évite le surcoût de reconnexion et réduit la probabilité d'erreurs de connexion dans les conteneurs de longue durée.
IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = True
Conseils de débogage
Pour obtenir une sortie de diagnostic gRPC détaillée, définissez les variables d'environnement suivantes dans votre Dockerfile ou votre configuration de conteneur :
ENV GRPC_TRACE=all
ENV GRPC_VERBOSITY=DEBUG
Vérifiez cef.log et IronSoftware.log pour plus de détails sur les échecs de connexion. Pour savoir comment récupérer les fichiers journaux d'Azure, consultez Azure Log Files.

