IronPDF Azure Kapsayıcılarında gRPC Bağlantı Hataları
IronPDF, Azure Kapsayıcı Örnekleri veya Azure Uygulama Hizmeti'nde Docker kapsayıcıları içinde dağıtıldığında, uygulama ile IronPDF motoru arasındaki gRPC iletişimi başarısız olabilir. Bu durum, bir kapsayıcı boşta kaldıktan veya yeniden başlatıldıktan sonra ya da gRPC kanalı yeniden deneme mantığı ile yapılandırılmadığında en sık meydana gelir.
Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="failed to connect to all addresses")
Status(StatusCode="Unknown", Detail="Stream removed")
Bu hatalar, Azure kapsayıcı ortamlarının boşta geçen dönemlerde kapsayıcıları kapatıp geri alabileceği için meydana gelir. gRPC kanalı üzerinde bir yeniden deneme politikası olmadan, tek bir bağlantı kaybı aramanın hemen başarısız olmasına neden olur, yeniden bağlanmaz. HTTP/2 akış kapatılması ve platforma özgü kanal ayarlama uyumsuzlukları da bu hataları üretebilir.
Çözüm
1. Kapsayıcı Yeniden Başlatma Politikasını Her Zaman Olarak Ayarlayın
Azure Kapsayıcı Örneklerinde, yeniden başlatma politikasını Always olarak ayarlayın. Azure Uygulama Hizmeti'nde, sıfıra ölçeklenen ve kapsayıcıları sonlandıran Tüketim planı yerine özel bir plan (Temel B1 veya daha yüksek) kullanın. Kalıcı bağlantılar gerektiren işler için, Kubernetes tarafından yönetilen kapsayıcılar daha istikrarlı bir seçenek sunar.
2. gRPC Yeniden Deneme Mantığını Yapılandırın
Hedef çerçevenize uygun yaklaşımı seçin.
.NET Framework için: JSON yeniden deneme politikası ile Grpc.Core.Channel kullanın
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)
)
.NET Core / .NET 5+ için: Grpc.Net.Client.GrpcChannel ile RetryPolicy kullanın
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. Daha Basit Yapılandırma için RemoteServer Kullanın
Özel kanal seçeneklerine ihtiyacınız yoksa, RemoteServer yerleşik yeniden deneme desteği sağlar ve çoğu Azure kapsayıcı dağıtımı için önerilen başlangıç noktasıdır. Motor ve uygulama kapsayıcıları aynı yerel ağda olmadığında, bunu .Docker() yerine kullanın. Tam bağlantı yapılandırma referansı için, IronPDF Motoru kılavuzuna bakın.
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. İstekler Arasında Motorun Kapatılmasını Önleyin
Varsayılan olarak, IronPDF istekler arasında motorunu kapatır. SkipShutdown ayarını true yaparak motor sürecini canlı tutar, böylece yeniden bağlantı yükünü önler ve uzun süre çalışan kapsayıcılarda bağlantı hatası olasılığını azaltır.
IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = true;
IronPdf.Installation.SkipShutdown = True
Hata Ayıklama İpuçları
Detaylı gRPC tanılama çıktısı almak için, Dockerfile ya da kapsayıcı yapılandırmanızda aşağıdaki ortam değişkenlerini ayarlayın:
ENV GRPC_TRACE=all
ENV GRPC_VERBOSITY=DEBUG
cef.log ve IronSoftware.log konularını kontrol edin, bağlantı hataları hakkında ek ayrıntılar için. Azure'dan log dosyalarını nasıl indireceğinizi öğrenmek için Azure Log Dosyaları bölümüne bakın.

