IronPDF Azure Kapsayıcılarında gRPC Bağlantı Hataları

This article was translated from English: Does it need improvement?
Translated
View the article in English

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)
)
$vbLabelText   $csharpLabel

.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)
)
$vbLabelText   $csharpLabel

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") _
)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku
Başlamaya Hazır mısınız?
Nuget İndirmeler 20,088,359 | Sürüm: 2026.7 yeni yayınlandı
Still Scrolling Icon

Hâlâ Kaydırıyor Musunuz?

Hızlıca kanıt ister misiniz? PM > Install-Package IronPdf
bir örnek çalıştır HTML'nizi bir PDF'ye dönüştüğünü izleyin.