# 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.
```txt
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
```
```txt
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**
```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)
);
```
**Pour .NET Core / .NET 5+ : utilisez `Grpc.Net.Client.GrpcChannel` avec `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. 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](/get-started/ironpdfengine/).
```csharp
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.
```csharp
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 :
```dockerfile
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](/troubleshooting/azure-log-files/).
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")
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
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
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)
);
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. 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.
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
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=allENV GRPC_VERBOSITY=DEBUG
ENV GRPC_TRACE=all
ENV GRPC_VERBOSITY=DEBUG
Text
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.
Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.