如何在C#中配置PDF渲染的代理伺服器

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

IronPDF中的代理配置是一個方法參數,位於RenderHtmlAsPdf()的重載中,而不是在ChromePdfRenderOptions的屬性上。 這個區別很重要,因為RenderHtmlAsPdf()完全沒有代理參數,這需要不同的策略來在企業代理後面渲染實時URL。 如果您傳遞null(預設值),IronPDF會直接連接。

本指南涵蓋生產中可能遇到的每個代理場景:直接代理字串、企業認證代理、RenderUrlAsPdf應變措施、Docker容器配置、CI/CD管道整合,以及SSL攔截和NTLM認證的常見故障排除模式。

開始免費30天試用來測試您環境中的代理配置。

快速入門:通過代理渲染PDF

IronPDF的可選proxy參數幫助您轉換在企業代理後提供的實時網頁。 使用這個程式碼片段快速開始。

  1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 複製並運行這段程式碼片段。

    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.co/rp.local:8080"
    );
    pdf.SaveAs("proxied-output.pdf");
  3. 部署以在您的實時環境中測試

    今天就開始在您的專案中使用IronPDF,透過免費試用

    arrow pointer

最小工作流程(3步)

  1. 使用NuGet安裝IronPDF:Install-Package IronPdf
  2. 將代理字串作為第三個參數傳遞給RenderHtmlAsPdf
  3. 格式:http(s)://user:pass@host:port,適用於已授權代理

如何將代理傳遞給RenderHtmlAsPdf

string

// 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

當此參數為null(預設值)時,IronPDF的Chromium引擎直接連接到外部資源——樣式表、圖像、字體和JavaScript文件引用於您的HTML中。 當您提供代理字串時,所有來自渲染引擎的HTTP/HTTPS請求通過該代理進行路由。

:path=/static-assets/pdf/content-code-examples/how-to/proxy-3.cs
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

代理字串支持https://模式。 當代理本身需要TLS加密您的應用程式和代理伺服器之間的連接時,使用https://。 這裡的模式指的是代理連接,而不是最終資源——一個https://資源。

靜態方法變體接受相同的代理參數,這對於在控制台應用程式或單元測試中的一次性渲染非常有用:

:path=/static-assets/pdf/content-code-examples/how-to/proxy-4.cs
// 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

重要:在Proxy屬性。 不要在那裡尋找它。 代理嚴格是一個FromHtml重載的方法參數。

如何使用企業代理進行身份驗證?

大多數企業代理需要憑證。 您直接在代理URL中嵌入它們,使用http(s)://username:password@host:port格式:

:path=/static-assets/pdf/content-code-examples/how-to/proxy-5.cs
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

URL編碼密碼中的特殊字元。如果您的密碼包含@, #, :, /或其他保留的URI字元,則必須進行百分比編碼。 常見編碼:

字元 編碼
@ %40
# %23
: %3A
/ %2F
! %21
% %25

Uri.EscapeDataString()程式來編碼密碼:

string rawPassword = "P@ssw0rd!";
string encoded = Uri.EscapeDataString(rawPassword); // "P%40ssw0rd%21"
string proxy = $"http://svc-account:{encoded}@proxy.co/rp.local:8080";
string rawPassword = "P@ssw0rd!";
string encoded = Uri.EscapeDataString(rawPassword); // "P%40ssw0rd%21"
string proxy = $"http://svc-account:{encoded}@proxy.co/rp.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.co/rp.local:8080"
$vbLabelText   $csharpLabel

不要將代理身份驗證與網頁身份驗證混淆。 NetworkPassword屬性是針對被渲染的網頁進行身份驗證(使用NTLM/Negotiate與網站),而不是針對代理伺服器。 對於代理身份驗證,憑證如上所示放在代理URL字串中。

Icon Quote related to 如何使用企業代理進行身份驗證?

我最喜歡的程式庫是IronPDF。它允許快速高效地操作PDF文件。它還有許多有價值的功能,例如導出到PDF/A格式和數位簽署PDF文件。

Milan Jovanovic related to 如何使用企業代理進行身份驗證?

Milan Jovanovic

Microsoft MVP

查看案例研究
Icon Quote related to 如何使用企業代理進行身份驗證?

IronOCR意味著我們每年可以從手動處理中節省$40,000,同時提高生產力,釋放資源以進行高影響的任務。我會強烈推薦它。

Brent Matzelle related to 如何使用企業代理進行身份驗證?

Brent Matzelle

首席技術官,OPYN

查看案例研究
Icon Quote related to 如何使用企業代理進行身份驗證?

IronSuite在我們的運營中扮演著至關重要的角色。這些工具增加了包括建立平面圖和改善庫存管理在內的業務效率。

David Jones related to 如何使用企業代理進行身份驗證?

David Jones

首席軟體工程師,Agorus Build

查看案例研究

如何渲染在代理後的URL?

RenderUrlToPdf不接受代理參數。 這是一個故意的API設計選擇——NavigateUrl將Chromium導航至一個URL,該導航的代理配置與HTML渲染期間的資源載入不同地處理。

建議的應變措施:使用配置了RenderHtmlAsPdf(使得引用的資產——圖像,CSS,字體——也通過代理進行路由)。

:path=/static-assets/pdf/content-code-examples/how-to/proxy-7.cs
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

<img src="/images/logo.png">, <link href="/css/styles.css">)正確解決。 proxy參數確保這些資產請求在渲染期間通過代理進行路由。

這種模式也適用於需要身份驗證的頁面——首先配置HttpClient與適當的Cookie或標頭,然後將已驗證的HTML傳遞給IronPDF。 HTTP請求標頭操作指南涵蓋身份驗證請求的標頭配置。

如果頁面依賴於JavaScript進行渲染(SPAs,React儀表板,Angular應用程式),抓取的HTML將僅包含初始殼層——在HttpClient抓取期間不會執行客戶端渲染。 對於這些情況,您有兩個選擇:設置系統層級的RenderHtmlAsPdf()之前進行抓取。

如何在Docker容器中配置代理?

在容器化環境中,您可能更喜歡系統層級的代理配置而不是每個方法的參數。 IronPDF的Chromium引擎尊重Linux容器用於外部流量路由的標準HTTPS_PROXY環境變數。

在您的Dockerfile中設置這些:

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

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

# 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"]

設置這些環境變數後,您可以在不使用代理參數的情況下調用RenderHtmlAsPdf——Chromium會自動獲取系統層級配置:

:path=/static-assets/pdf/content-code-examples/how-to/proxy-9.cs
// 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

RenderHtmlAsPdf()對於內部資源很重要。 如果沒有它,對於內部服務(如在Kubernetes集群內運行的本地CSS伺服器或圖片CDN)的請求將被不必要地通過代理進行路由。 使用逗號分隔應該繞過代理的主機名和域名。

如果您需要既將系統層級的代理用於一般流量,又使用不同的代理進行特定渲染,方法參數優先於環境變數。 這在需要時為每次渲染提供控制。

如何在CI/CD管道中處理代理?

在企業網路中的CI/CD runner經常位於代理後。 將代理URL作為構建變數或祕密傳遞,絕不要在源程式碼中硬編碼憑證。

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(宣告式管道):

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

在所有三種情況下,Chromium會自動讀取環境變數。 如果您偏好明確控制,從環境中讀取代理URL並將其作為方法參數傳遞:

:path=/static-assets/pdf/content-code-examples/how-to/proxy-13.cs
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

如何排除代理問題?

超時錯誤: 企業代理增加延遲。 將渲染超時時間從60秒的預設時間增加:

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

這是RenderTimeout屬性——它控制Chromium在頁面載入和資源抓取的總合上等待的時間。 如果您的代理每次請求增加5-10秒的延遲,而頁面載入20個以上的外部資源,60秒可能不夠。

SSL截取(MITM代理): 很多企業代理使用企業根CA證書解密和重新加密HTTPS流量。 Chromium拒絕這些連接,因為預設情況下它不信任企業CA。 兩種解決方案:

  1. 安裝企業CA證書到容器或主機的受信任根儲存。 在Linux中:將update-ca-certificates
  2. 僅在開發中, 您可以禁用證書驗證——但絕不要在生產中這樣做。 更安全的方法始終是安裝正確的證書。

NTLM驗證: 行內user:pass@host格式支持基本和摘要代理身份驗證。 NTLM(在Windows中心的企業中常見)不支持通過代理URL字串的方式。 替代方案是在主機或作為側車容器上運行本地NTLM到基本轉發代理,如CNTLM。 使用您的NTLM憑證配置CNTLM,然後將IronPDF指向http://localhost:3128(CNTLM的預設埠)。

空白PDF或缺少資產: 如果PDF渲染完成但圖像/CSS丟失,您的HTML引用了代理阻擋的資源或需要不同代理路徑的資源。 驗證baseUrlOrPath參數通過代理正確解析,並檢查代理的存取日誌中是否有403或407響應。

本地資產的代理繞過: 如果您的HTML引用了本地資產(包自的圖像,內聯CSS)和遠程資源(CDN字體,外部腳本)的混合,代理只需要處理遠程請求。 設置baseUrlOrPath為文件系統資產的本地目錄,並讓代理僅處理網路請求。 這可以避免不必要地將本地文件讀取路由通過代理。

診斷連通性: 為了驗證您的代理字串正確無誤,請首先用一個簡單的HttpClient請求進行測試:

var proxy = new WebProxy("http://proxy.co/rp.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.co/rp.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.Net.Http
Imports System.Net

Dim proxy As New WebProxy("http://proxy.co/rp.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

如果這成功但IronPDF仍失敗,問題可能是SSL截取或您的代理與Chromium的CONNECT隧道協議不匹配。 檢查代理是否支持HTTP CONNECT用於HTTPS資源——有些代理需要明確配置以允許隧道。

下一步

IronPDF中的代理支持是一個RenderHtmlAsPdf()的方法參數——傳遞代理字串,Chromium引擎通過它路由所有HTTP流量。 對於HTTPS_PROXY環境變數讓您不必進行程式碼更改即可進行基礎設施級別的控制。

探索登錄和身份驗證操作指南以進行網頁身份驗證(與代理身份驗證不同),HTTP請求標頭指導以獲得自訂標頭,渲染選項參考以獲得超時和性能調整。

查看授權選項從$999開始。 ChromePdfRenderer API參考文件記錄了每個方法的重載,ChromePdfRenderOptions參考涵蓋了所有可配置的屬性。 RenderUrlAsPdf() ProxyAddress ChromePdfRenderOptions RenderHtmlAsPdf StaticRenderHtmlAsPdf RenderUrlAsPdf HttpClient WebProxy RenderHtmlAsPdf() ```yaml

規範: 容器:

  • 名稱:pdf-generator 鏡像:myregistry/pdf-service:latest 環境:

常見問題

如何在C#中配置代理伺服器以進行PDF渲染?

要在C#中配置代理伺服器以進行PDF渲染,您可以在IronPDF中的RenderHtmlAsPdf方法調用時使用代理參數。這樣,您就可以為存取網頁資源指定代理配置。

使用IronPDF的代理的目的是什麼?

在渲染PDF時使用IronPDF的代理有助於管理網路請求,尤其是在諸如防火牆后或企業網路中這樣受限制的網路存取的環境中。

IronPDF可以處理已認證的代理嗎?

是的,IronPDF可以處理已認證的代理。您需要在C#程式碼中提供必要的身份驗證憑證和代理設置。

在Docker容器中可以使用IronPDF設置代理嗎?

是的,可以將IronPDF配置為在Docker容器中使用代理。確保Docker環境變數正確設置以傳遞代理設置。

如何解決IronPDF的代理問題?

要解決IronPDF的代理問題,請檢查您的代理設置,確保身份驗證詳細資料正確,並驗證網路可存取性。查看日誌中的任何錯誤消息也可以幫助識別問題。

IronPDF是否可以在有代理配置的CI/CD管道中使用?

是的,IronPDF可以結合代理配置整合到CI/CD管道中。確保您的構建環境設置正確,以便在PDF渲染過程中傳遞必要的代理配置。

在企業環境中使用IronPDF使用代理的好處是什麼?

在企業環境中使用IronPDF的代理可以增強安全性、控制網路存取並管理帶寬使用,便於符合組織IT政策。

Darrius Serrant
全端軟體工程師(WebOps)

Darrius Serrant擁有邁阿密大學的電腦科學學士學位,並在Iron Software擔任全端WebOps行銷工程師。從小就對程式設計有興趣,他認為計算既神秘又易於理解,成為創意和問題解決的完美媒介。

在Iron Software,Darrius喜歡創造新事物並簡化複雜的概念,使其更易於理解。作為我們的常駐開發人員之一,他還志願教學,將他的專業知識傳授給下一代。

對Darrius來說,他的工作是有意義的,因為它有價值且對社會有真正的影響。

準備開始了嗎?
Nuget 下載 20,088,359 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想快速獲得證明嗎? PM > Install-Package IronPdf
執行範例 看您的HTML變成PDF。