Jak skonfigurować serwery proxy do renderowania PDF w C

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

Konfiguracja proxy w IronPDF jest parametrem metody w przeciążeniach RenderHtmlAsPdf() — a nie właściwością w ChromePdfRenderOptions. To rozróżnienie jest istotne, ponieważ RenderUrlAsPdf() nie ma w ogóle parametru proxy, co wymaga innej strategii, gdy chcesz renderować żywe adresy URL za korporacyjnym proxy. Jeśli przekażesz null (domyślnie), IronPDF łączy się bezpośrednio.

Ten przewodnik obejmuje każdy scenariusz proxy, jaki napotkasz w produkcji: bezpośrednie ciągi proxy, uwierzytelnione korporacyjne proxy, obejście RenderUrlAsPdf, konfigurację kontenerów Docker, integrację z potokami CI/CD oraz typowe wzorce rozwiązywania problemów z przechwytaniem SSL i uwierzytelnianiem NTLM.

Rozpocznij bezpłatny 30-dniowy okres próbny, aby przetestować konfiguracje proxy w Twoim środowisku.

Szybki start: Renderowanie PDF-ów przez proxy

Opcjonalny parametr proxy IronPDF pomaga konwertować żywe strony internetowe serwowane za korporacyjnymi proxy. Użyj tego przykładu kodu, aby szybko zacząć.

  1. Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf
  2. Skopiuj i uruchom ten fragment kodu.

    using IronPdf;
    
    var renderer = new ChromePdfRenderer();
    
    // Proxy is the third parameter — not a render option
    PdfDocument pdf = renderer.RenderHtmlAsPdf(
        "<h1>Hello from behind the proxy</h1>",
        baseUrlOrPath: null,
        proxy: "http://proxy.corp.local:8080"
    );
    pdf.SaveAs("proxied-output.pdf");
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronPDF w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer

Minimalny przebieg pracy (3 kroki)

  1. Zainstaluj IronPDF poprzez NuGet: Install-Package IronPdf
  2. Przekaż ciąg proxy jako trzeci parametr do RenderHtmlAsPdf()
  3. Format: http(s)://host:port lub http(s)://user:pass@host:port dla uwierzytelnionych proxy

Jak przekazać proxy do RenderHtmlAsPdf?

Parametr Proxy jest opcjonalnym string w czterech sygnaturach metody:

// Instance methods
PdfDocument RenderHtmlAsPdf(string Html, string BaseUrlOrPath, string Proxy = null)
PdfDocument RenderHtmlAsPdf(string Html, Uri BaseUrl = null, string Proxy = null)

// Static methods
PdfDocument StaticRenderHtmlAsPdf(string Html, ChromePdfRenderOptions Options = null, string Proxy = null)
PdfDocument StaticRenderHtmlAsPdf(string Html, string BaseUrlOrPath, ChromePdfRenderOptions Options = null, string Proxy = null)
// Instance methods
PdfDocument RenderHtmlAsPdf(string Html, string BaseUrlOrPath, string Proxy = null)
PdfDocument RenderHtmlAsPdf(string Html, Uri BaseUrl = null, string Proxy = null)

// Static methods
PdfDocument StaticRenderHtmlAsPdf(string Html, ChromePdfRenderOptions Options = null, string Proxy = null)
PdfDocument StaticRenderHtmlAsPdf(string Html, string BaseUrlOrPath, ChromePdfRenderOptions Options = null, string Proxy = null)
' Instance methods
Function RenderHtmlAsPdf(Html As String, BaseUrlOrPath As String, Optional Proxy As String = Nothing) As PdfDocument
End Function

Function RenderHtmlAsPdf(Html As String, Optional BaseUrl As Uri = Nothing, Optional Proxy As String = Nothing) As PdfDocument
End Function

' Static methods
Shared Function StaticRenderHtmlAsPdf(Html As String, Optional Options As ChromePdfRenderOptions = Nothing, Optional Proxy As String = Nothing) As PdfDocument
End Function

Shared Function StaticRenderHtmlAsPdf(Html As String, BaseUrlOrPath As String, Optional Options As ChromePdfRenderOptions = Nothing, Optional Proxy As String = Nothing) As PdfDocument
End Function
$vbLabelText   $csharpLabel

Gdy parametr ten jest null (domyślnie), silnik Chromium IronPDF łączy się bezpośrednio z zewnętrznymi zasobami — arkuszami stylów, obrazami, czcionkami i plikami JavaScript odwołanymi w Twoim HTML. Gdy podasz ciąg proxy, wszystkie żądania HTTP/HTTPS z silnika renderującego są kierowane przez to proxy.

using IronPdf;

var renderer = new ChromePdfRenderer();

// Direct connection (default — no proxy)
var pdfDirect = renderer.RenderHtmlAsPdf("<h1>Direct</h1>");

// Through an unauthenticated proxy
var pdfProxied = renderer.RenderHtmlAsPdf(
    "<h1>Proxied</h1>",
    baseUrlOrPath: null,
    proxy: "http://squid.internal:3128"
);

// Using the Uri overload
var pdfUri = renderer.RenderHtmlAsPdf(
    "<h1>Proxied via Uri overload</h1>",
    baseUrl: new Uri("https://assets.example.com/"),
    proxy: "https://proxy.corp.local:8443"
);
using IronPdf;

var renderer = new ChromePdfRenderer();

// Direct connection (default — no proxy)
var pdfDirect = renderer.RenderHtmlAsPdf("<h1>Direct</h1>");

// Through an unauthenticated proxy
var pdfProxied = renderer.RenderHtmlAsPdf(
    "<h1>Proxied</h1>",
    baseUrlOrPath: null,
    proxy: "http://squid.internal:3128"
);

// Using the Uri overload
var pdfUri = renderer.RenderHtmlAsPdf(
    "<h1>Proxied via Uri overload</h1>",
    baseUrl: new Uri("https://assets.example.com/"),
    proxy: "https://proxy.corp.local:8443"
);
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Direct connection (default — no proxy)
Dim pdfDirect = renderer.RenderHtmlAsPdf("<h1>Direct</h1>")

' Through an unauthenticated proxy
Dim pdfProxied = renderer.RenderHtmlAsPdf(
    "<h1>Proxied</h1>",
    baseUrlOrPath:=Nothing,
    proxy:="http://squid.internal:3128"
)

' Using the Uri overload
Dim pdfUri = renderer.RenderHtmlAsPdf(
    "<h1>Proxied via Uri overload</h1>",
    baseUrl:=New Uri("https://assets.example.com/"),
    proxy:="https://proxy.corp.local:8443"
)
$vbLabelText   $csharpLabel

Ciąg proxy obsługuje zarówno schematy http://, jak i https://. Użyj https://, gdy samo proxy wymaga szyfrowania TLS dla połączenia między Twoją aplikacją a serwerem proxy. Schemat tutaj odnosi się do połączenia proxy, a nie do ostatecznego zasobu — proxy http:// może nadal pobierać zasoby https:// za pomocą tunelingu CONNECT.

Statyczne warianty metody akceptują ten sam parametr proxy, co jest przydatne dla renderów jednorazowych w aplikacjach konsolowych lub testach jednostkowych:

// Static render with proxy — no renderer instance needed
var pdf = ChromePdfRenderer.StaticRenderHtmlAsPdf(
    "<h1>Static render through proxy</h1>",
    options: null,
    proxy: "http://proxy.corp.local:8080"
);
// Static render with proxy — no renderer instance needed
var pdf = ChromePdfRenderer.StaticRenderHtmlAsPdf(
    "<h1>Static render through proxy</h1>",
    options: null,
    proxy: "http://proxy.corp.local:8080"
);
' Static render with proxy — no renderer instance needed
Dim pdf = ChromePdfRenderer.StaticRenderHtmlAsPdf(
    "<h1>Static render through proxy</h1>",
    options:=Nothing,
    proxy:="http://proxy.corp.local:8080"
)
$vbLabelText   $csharpLabel

Ważne: Nie ma właściwości ProxyAddress w ChromePdfRenderOptions. Nie szukaj tego tam. Proxy jest ściśle parametrem metody w przeciążeniach RenderHtmlAsPdf oraz StaticRenderHtmlAsPdf.

Jak uwierzytelnić się za pomocą firmowego serwera proxy?

Większość serwerów proxy dla Enterprise wymaga podania danych uwierzytelniających. Wbuduj je bezpośrednio w adres URL proxy, używając formatu http(s)://username:password@host:port:

using IronPdf;

var renderer = new ChromePdfRenderer();

string proxyWithAuth = "http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080";

PdfDocument pdf = renderer.RenderHtmlAsPdf(
    htmlContent,
    baseUrlOrPath: @"C:\templates\assets\",
    proxy: proxyWithAuth
);
pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string proxyWithAuth = "http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080";

PdfDocument pdf = renderer.RenderHtmlAsPdf(
    htmlContent,
    baseUrlOrPath: @"C:\templates\assets\",
    proxy: proxyWithAuth
);
pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim proxyWithAuth As String = "http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(
    htmlContent,
    baseUrlOrPath: "C:\templates\assets\",
    proxy:=proxyWithAuth
)
pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

Koduj URL-owo znaki specjalne w hasłach. Jeśli Twoje hasło zawiera @, #, :, / lub inne zarezerwowane znaki URI, muszą być one kodowane procentowo. Typowe kodowania:

Znak Zakodowane
@ %40
# %23
: %3A
/ %2F
! %21
% %25

Użyj Uri.EscapeDataString(), aby zakodować hasło programowo:

string rawPassword = "P@ssw0rd!";
string encoded = Uri.EscapeDataString(rawPassword); // "P%40ssw0rd%21"
string proxy = $"http://svc-account:{encoded}@proxy.corp.local:8080";
string rawPassword = "P@ssw0rd!";
string encoded = Uri.EscapeDataString(rawPassword); // "P%40ssw0rd%21"
string proxy = $"http://svc-account:{encoded}@proxy.corp.local:8080";
Imports System

Dim rawPassword As String = "P@ssw0rd!"
Dim encoded As String = Uri.EscapeDataString(rawPassword) ' "P%40ssw0rd%21"
Dim proxy As String = $"http://svc-account:{encoded}@proxy.corp.local:8080"
$vbLabelText   $csharpLabel

Nie myl uwierzytelniania proxy z uwierzytelnianiem strony internetowej. Właściwości ChromeHttpLoginCredentials.NetworkUsername i NetworkPassword uwierzytelniają się w stosunku do strony internetowej, która ma być renderowana (NTLM/Negotiate z witryną), a nie w stosunku do serwera proxy. W przypadku uwierzytelniania proxy dane uwierzytelniające należy umieścić w ciągu adresu URL proxy, jak pokazano powyżej.

Jak renderować adresy URL za serwerem proxy?

RenderUrlAsPdf() nie akceptuje parametru proxy. To celowy wybór projektowy API — RenderUrlAsPdf nawigacje Chromium do URL-a, a konfiguracja proxy dla tej nawigacji jest obsługiwana inaczej niż podczas ładowania zasobów podczas renderowania HTML.

Zalecane obejście: pobierz HTML samodzielnie, używając HttpClient skonfigurowanego z WebProxy, a następnie przekaż ciąg HTML do RenderHtmlAsPdf() z parametrem proxy (tak, aby odwoływane zasoby — obrazy, CSS, czcionki — również były kierowane przez proxy).

using IronPdf;
using System.Net;
using System.Net.Http;

// Step 1: Configure HttpClient with the corporate proxy
var proxy = new WebProxy("http://proxy.corp.local:8080")
{
    Credentials = new NetworkCredential("svc-account", "P@ssw0rd!")
};

var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
using var httpClient = new HttpClient(handler);

// Step 2: Fetch the HTML from the target URL
string targetUrl = "https://dashboard.internal.corp/quarterly-report";
string html = await httpClient.GetStringAsync(targetUrl);

// Step 3: Render the fetched HTML, with the proxy for asset loading
var renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf(
    html,
    baseUrlOrPath: targetUrl,  // Resolves relative asset paths against the original URL
    proxy: "http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080"
);
pdf.SaveAs("quarterly-report.pdf");
using IronPdf;
using System.Net;
using System.Net.Http;

// Step 1: Configure HttpClient with the corporate proxy
var proxy = new WebProxy("http://proxy.corp.local:8080")
{
    Credentials = new NetworkCredential("svc-account", "P@ssw0rd!")
};

var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
using var httpClient = new HttpClient(handler);

// Step 2: Fetch the HTML from the target URL
string targetUrl = "https://dashboard.internal.corp/quarterly-report";
string html = await httpClient.GetStringAsync(targetUrl);

// Step 3: Render the fetched HTML, with the proxy for asset loading
var renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderHtmlAsPdf(
    html,
    baseUrlOrPath: targetUrl,  // Resolves relative asset paths against the original URL
    proxy: "http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080"
);
pdf.SaveAs("quarterly-report.pdf");
Imports IronPdf
Imports System.Net
Imports System.Net.Http

' Step 1: Configure HttpClient with the corporate proxy
Dim proxy As New WebProxy("http://proxy.corp.local:8080") With {
    .Credentials = New NetworkCredential("svc-account", "P@ssw0rd!")
}

Dim handler As New HttpClientHandler With {.Proxy = proxy, .UseProxy = True}
Using httpClient As New HttpClient(handler)
    ' Step 2: Fetch the HTML from the target URL
    Dim targetUrl As String = "https://dashboard.internal.corp/quarterly-report"
    Dim html As String = Await httpClient.GetStringAsync(targetUrl)

    ' Step 3: Render the fetched HTML, with the proxy for asset loading
    Dim renderer As New ChromePdfRenderer()

    Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(
        html,
        baseUrlOrPath:=targetUrl,  ' Resolves relative asset paths against the original URL
        proxy:="http://svc-account:P%40ssw0rd%21@proxy.corp.local:8080"
    )
    pdf.SaveAs("quarterly-report.pdf")
End Using
$vbLabelText   $csharpLabel

Parametr baseUrlOrPath jest ustawiany na oryginalny docelowy URL, aby względne ścieżki w pobranym HTML (<img src="/images/logo.png">, <link href="/css/styles.css">) poprawnie się rozwiązywały. Parametr proxy zapewnia, że żądania zasobów są kierowane przez proxy podczas renderowania.

Ten wzorzec działa również z stronami za uwierzytelnieniem — skonfiguruj HttpClient z odpowiednimi ciasteczkami lub nagłówkami przed pobraniem, a następnie przekaż uwierzytelniony HTML do IronPDF. Poradnik dotyczący nagłówków żądań HTTP obejmuje konfigurację nagłówków dla żądań uwierzytelnionych.

Jeśli strona opiera się na JavaScript do renderowania (SPA, pulpity React, aplikacje Angular), pobrany HTML będzie zawierał tylko początkową powłokę — rendering po stronie klienta nie zostanie wykonany podczas pobierania HttpClient. W takich przypadkach masz dwie opcje: ustawić zmienne środowiskowe HTTPS_PROXY na poziomie systemu (opisane w następnej sekcji), tak aby RenderUrlAsPdf() były kierowane przez proxy na poziomie systemu operacyjnego, lub użyć przeglądarki bezgłowej do pobrania w pełni renderowanego HTML, zanim przekażesz go do RenderHtmlAsPdf().

Jak skonfigurować serwer proxy w kontenerach Docker?

W środowiskach kontenerowych można preferować konfigurację proxy na poziomie systemu zamiast parametrów poszczególnych metod. Silnik Chromium IronPDF respektuje standardowe zmienne środowiskowe HTTP_PROXY i HTTPS_PROXY, których używają kontenery Linux do kierowania ruchu wyjściowego.

Ustaw to w pliku Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

# System-level proxy for all outbound HTTP/HTTPS traffic
ENV HTTP_PROXY=http://proxy.corp.local:8080
ENV HTTPS_PROXY=http://proxy.corp.local:8080
ENV NO_PROXY=localhost,127.0.0.1,.internal.corp

# Install IronPDF dependencies (fonts, etc.)
RUN apt-get update && apt-get install -y \
    libgdiplus \
    libc6-dev \
    fonts-liberation \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

Gdy te zmienne środowiskowe są ustawione, możesz wywołać RenderHtmlAsPdf() bez parametru proxy — Chromium automatycznie pobiera konfigurację na poziomie systemu:

// No proxy parameter needed — Chromium uses HTTP_PROXY env var
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// No proxy parameter needed — Chromium uses HTTP_PROXY env var
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
' No proxy parameter needed — Chromium uses HTTP_PROXY env var
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
$vbLabelText   $csharpLabel

NO_PROXY jest ważne dla zasobów wewnętrznych. W przeciwnym razie żądania kierowane do usług wewnętrznych (takich jak lokalny serwer CSS lub CDN obrazów działający w klastrze Kubernetes) byłyby niepotrzebnie przekierowywane przez serwer proxy. Nazwy hostów i domen, które powinny ominąć serwer proxy, należy oddzielić przecinkami.

Jeśli potrzebujesz zarówno proxy na poziomie systemu dla ogólnego ruchu, jak i innego proxy dla konkretnych renderowań, parametr metody ma pierwszeństwo przed zmienną środowiskową. Daje to kontrolę nad renderowaniem w razie potrzeby.

W przypadku wdrożeń Kubernetes należy wprowadzić konfigurację proxy za pomocą ConfigMaps lub zmiennych środowiskowych w specyfikacji podu, zamiast kodować je na stałe w pliku Dockerfile. Dzięki temu ten sam obraz kontenera będzie działał w środowiskach o różnych konfiguracjach proxy:

# Kubernetes pod spec
spec:
  containers:
    - name: pdf-generator
      image: myregistry/pdf-service:latest
      env:
        - name: HTTP_PROXY
          valueFrom:
            configMapKeyRef:
              name: proxy-config
              key: http-proxy
        - name: HTTPS_PROXY
          valueFrom:
            configMapKeyRef:
              name: proxy-config
              key: https-proxy
        - name: NO_PROXY
          value: "localhost,127.0.0.1,.internal.corp"
# Kubernetes pod spec
spec:
  containers:
    - name: pdf-generator
      image: myregistry/pdf-service:latest
      env:
        - name: HTTP_PROXY
          valueFrom:
            configMapKeyRef:
              name: proxy-config
              key: http-proxy
        - name: HTTPS_PROXY
          valueFrom:
            configMapKeyRef:
              name: proxy-config
              key: https-proxy
        - name: NO_PROXY
          value: "localhost,127.0.0.1,.internal.corp"
YAML

Gdy obecna jest zarówno zmienna środowiskowa, jak i parametr metody, pierwszeństwo ma parametr metody. Daje to model konfiguracji warstwowej: ustaw domyślny serwer proxy na poziomie infrastruktury i zastępuj go przy każdym renderowaniu, gdy konkretne żądania wymagają innej trasy.

Jak radzisz sobie z proxy w potokach CI/CD?

Programy CI/CD w sieciach korporacyjnych często działają za serwerami proxy. Przekaż adres URL serwera proxy jako zmienną kompilacji lub sekret — nigdy nie zapisuj danych uwierzytelniających na stałe w systemie kontroli wersji.

GitHub Actions:

jobs:
  generate-pdf:
    runs-on: ubuntu-latest
    env:
      HTTP_PROXY: ${{ secrets.CORP_PROXY_URL }}
      HTTPS_PROXY: ${{ secrets.CORP_PROXY_URL }}
    steps:
      - uses: actions/checkout@v4
      - run: dotnet build
      - run: dotnet test
jobs:
  generate-pdf:
    runs-on: ubuntu-latest
    env:
      HTTP_PROXY: ${{ secrets.CORP_PROXY_URL }}
      HTTPS_PROXY: ${{ secrets.CORP_PROXY_URL }}
    steps:
      - uses: actions/checkout@v4
      - run: dotnet build
      - run: dotnet test
YAML

Azure DevOps:

variables:
  - group: proxy-settings  # Contains PROXY_URL secret

steps:
  - script: |
      export HTTP_PROXY=$(PROXY_URL)
      export HTTPS_PROXY=$(PROXY_URL)
      dotnet run --project PdfGenerator
    displayName: 'Generate PDFs behind proxy'
variables:
  - group: proxy-settings  # Contains PROXY_URL secret

steps:
  - script: |
      export HTTP_PROXY=$(PROXY_URL)
      export HTTPS_PROXY=$(PROXY_URL)
      dotnet run --project PdfGenerator
    displayName: 'Generate PDFs behind proxy'
YAML

Jenkins (deklaratywny potok):

environment {
    HTTP_PROXY  = credentials('corp-proxy-url')
    HTTPS_PROXY = credentials('corp-proxy-url')
}

We wszystkich trzech przypadkach Chromium automatycznie odczytuje zmienne środowiskowe. Jeśli wolisz mieć pełną kontrolę, odczytaj adres URL serwera proxy ze środowiska i przekaż go jako parametr metody:

string? proxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
var pdf = renderer.RenderHtmlAsPdf(html, baseUrlOrPath: null, proxy: proxy);
string? proxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
var pdf = renderer.RenderHtmlAsPdf(html, baseUrlOrPath: null, proxy: proxy);
Option Strict On



Dim proxy As String = Environment.GetEnvironmentVariable("HTTPS_PROXY")
Dim pdf = renderer.RenderHtmlAsPdf(html, baseUrlOrPath:=Nothing, proxy:=proxy)
$vbLabelText   $csharpLabel

Jak rozwiązywać problemy związane z serwerem proxy?

Błędy przekroczenia limitu czasu: korporacyjne serwery proxy powodują opóźnienia. Zwiększ limit czasu renderowania z domyślnych 60 sekund:

renderer.RenderingOptions.Timeout = 120; // seconds
renderer.RenderingOptions.Timeout = 120; // seconds
renderer.RenderingOptions.Timeout = 120 ' seconds
$vbLabelText   $csharpLabel

To jest właściwość ChromePdfRenderOptions.Timeout — kontroluje, jak długo Chromium czeka na załadowanie strony i pobieranie zasobów łącznie. Jeśli Twój serwer proxy powoduje opóźnienie rzędu 5–10 sekund na żądanie, a strona ładuje ponad 20 zasobów zewnętrznych, 60 sekund może nie wystarczyć.

Przechwytywanie SSL (proxy MITM): Wiele proxy korporacyjnych odszyfrowuje i ponownie szyfruje ruch HTTPS przy użyciu korporacyjnego certyfikatu głównego urzędu certyfikacji. Chromium odrzuca te połączenia, ponieważ domyślnie nie ufa korporacyjnemu certyfikatowi CA. Dwa rozwiązania:

  1. Zainstaluj certyfikat CA firmy w zaufanym magazynie głównym kontenera lub hosta. W Linux: skopiuj .crt do /usr/local/share/ca-certificates/ i uruchom update-ca-certificates.
  2. Tylko w środowisku programistycznym można wyłączyć weryfikację certyfikatów — ale nigdy nie należy tego robić w środowisku produkcyjnym. Bezpieczniejszym rozwiązaniem jest zawsze zainstalowanie odpowiedniego certyfikatu.

Uwierzytelnianie NTLM: Wbudowany format user:pass@host wspiera uwierzytelnianie proxy Basic i Digest. NTLM (powszechnie stosowany w Enterprise korzystającym z systemu Windows) nie jest obsługiwany przez ciąg adresu URL serwera proxy. Rozwiązaniem jest uruchomienie lokalnego proxy przekierowującego z NTLM do Basic, takiego jak CNTLM, na hoście lub jako kontener typu sidecar. Skonfiguruj CNTLM z Twoimi poświadczeniami NTLM, a następnie wskaż IronPDF na http://localhost:3128 (domyślny port CNTLM).

Pusty plik PDF lub brakujące zasoby: Jeśli plik PDF wyświetla się, ale brakuje obrazów/CSS, kod HTML odwołuje się do zasobów, które są blokowane przez serwer proxy lub wymagają innej ścieżki proxy. Upewnij się, że parametr baseUrlOrPath rozwiązuje się poprawnie przez proxy, i sprawdź logi dostępu proxy pod kątem odpowiedzi 403 lub 407.

Omijanie proxy dla zasobów lokalnych: Jeśli kod HTML odwołuje się zarówno do zasobów lokalnych (obrazy w pakiecie, wbudowany CSS), jak i zasobów zdalnych (czcionki z CDN, skrypty zewnętrzne), proxy musi obsługiwać tylko żądania zdalne. Ustaw baseUrlOrPath na lokalny katalog dla zasobów systemu plików, a pozwól proxy obsługiwać tylko żądania sieciowe. Pozwala to uniknąć niepotrzebnego kierowania odczytu plików lokalnych przez serwer proxy.

Diagnozowanie łączności: Aby zweryfikować, że Twój ciąg proxy jest poprawny przed użyciem go z IronPDF, przetestuj go najpierw prostym żądaniem HttpClient:

var proxy = new WebProxy("http://proxy.corp.local:8080");
var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
using var client = new HttpClient(handler);

var response = await client.GetAsync("https://httpbin.org/ip");
Console.WriteLine(await response.Content.ReadAsStringAsync());
// Should return the proxy's external IP, not your machine's IP
var proxy = new WebProxy("http://proxy.corp.local:8080");
var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
using var client = new HttpClient(handler);

var response = await client.GetAsync("https://httpbin.org/ip");
Console.WriteLine(await response.Content.ReadAsStringAsync());
// Should return the proxy's external IP, not your machine's IP
Imports System
Imports System.Net
Imports System.Net.Http

Dim proxy As New WebProxy("http://proxy.corp.local:8080")
Dim handler As New HttpClientHandler With {.Proxy = proxy, .UseProxy = True}
Using client As New HttpClient(handler)
    Dim response = Await client.GetAsync("https://httpbin.org/ip")
    Console.WriteLine(Await response.Content.ReadAsStringAsync())
    ' Should return the proxy's external IP, not your machine's IP
End Using
$vbLabelText   $csharpLabel

Jeśli to zadziała, ale IronPDF nadal nie działa, problemem jest prawdopodobnie przechwytywanie SSL lub niezgodność protokołów między Twoim serwerem proxy a tunelowaniem CONNECT w Chromium. Sprawdź, czy serwer proxy obsługuje protokół HTTP CONNECT dla zasobów HTTPS — niektóre serwery proxy wymagają wyraźnej konfiguracji, aby umożliwić tunelowanie.

Kolejne kroki

Wsparcie dla proxy w IronPDF to parametr metody w RenderHtmlAsPdf() — przekaż ciąg proxy, a silnik Chromium kieruje przez to całkowity ruch HTTP. W przypadku scenariuszy RenderUrlAsPdf() najpierw pobierz HTML za pomocą HttpClient i WebProxy. Dla kontenerów i CI/CD zmienne środowiskowe HTTPS_PROXY na poziomie systemu zapewniają kontrolę na poziomie infrastruktury bez zmian w kodzie.

Zapoznaj się z instrukcją logowania i uwierzytelniania na stronach internetowych (odróżniającą się od uwierzytelniania proxy), przewodnikiem po nagłówkach żądań HTTP dotyczącym niestandardowych nagłówków oraz opisem opcji renderowania w zakresie limitów czasu i optymalizacji wydajności.

Zobacz opcje licencjonowania zaczynając od $749. Dokumentacja API ChromePdfRenderer dokumentuje każde przeciążenie metody, a dokumentacja ChromePdfRenderOptions obejmuje wszystkie konfigurowalne właściwości.

Często Zadawane Pytania

Jak skonfigurować serwer proxy do renderowania plików PDF w języku C#?

Aby skonfigurować serwer proxy do renderowania plików PDF w języku C#, można użyć parametru proxy podczas wywoływania metody RenderHtmlAsPdf w bibliotece IronPDF. Pozwala to określić ustawienia proxy dla dostępu do zasobów internetowych.

Jaki jest cel korzystania z serwera proxy w połączeniu z IronPDF?

Korzystanie z serwera proxy w połączeniu z IronPDF ułatwia zarządzanie żądaniami sieciowymi podczas renderowania plików PDF, zwłaszcza w środowiskach o ograniczonym dostępie do Internetu, takich jak sieci chronione zaporami ogniowymi lub sieci korporacyjne.

Czy IronPDF obsługuje proxy z uwierzytelnianiem?

Tak, IronPDF obsługuje proxy z uwierzytelnianiem. W kodzie C# należy podać niezbędne dane uwierzytelniające wraz z ustawieniami proxy.

Czy można używać IronPDF z serwerem proxy w kontenerze Docker?

Tak, IronPDF można skonfigurować do pracy z serwerem proxy w kontenerze Docker. Upewnij się, że zmienne środowiskowe Docker są poprawnie ustawione, aby przekazać ustawienia proxy.

Jak rozwiązać problemy z serwerem proxy w IronPDF?

Aby rozwiązać problemy z proxy w IronPDF, sprawdź ustawienia proxy, upewnij się, że dane uwierzytelniające są poprawne, i zweryfikuj dostępność sieci. Przejrzenie komunikatów o błędach w logach może również pomóc w zidentyfikowaniu problemu.

Czy IronPDF może być używany w potokach CI/CD z konfiguracjami proxy?

Tak, IronPDF można zintegrować z potokami CI/CD za pomocą konfiguracji proxy. Upewnij się, że Twoje środowisko kompilacji jest skonfigurowane tak, aby przekazywać niezbędne ustawienia proxy podczas procesu renderowania plików PDF.

Jakie są zalety korzystania z serwera proxy w połączeniu z IronPDF w środowiskach Enterprise?

Korzystanie z serwera proxy w połączeniu z IronPDF w środowiskach korporacyjnych może zwiększyć bezpieczeństwo, umożliwić kontrolę dostępu do Internetu oraz zarządzanie wykorzystaniem przepustowości, ułatwiając tym samym przestrzeganie wewnętrznych zasad IT organizacji.

Darrius Serrant
Full Stack Software Engineer (WebOps)

Darrius Serrant posiada tytuł licencjata z informatyki z Uniwersytetu Miami i pracuje jako Full Stack WebOps Marketing Engineer w Iron Software. Już od młodych lat zainteresował się kodowaniem, postrzegając informatykę jako zarówno tajemniczą, jak i dostępną, co czyni ją doskonałym medium dla kreatywności ...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 18,135,201 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPdf
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.