如何在C#中配置代理服务器进行PDF渲染
在IronPDF中,代理配置是RenderHtmlAsPdf()重载中的方法参数,而不是ChromePdfRenderOptions上的属性。 这种区分很重要,因为RenderUrlAsPdf()根本没有代理参数,这要求您在需要通过企业代理渲染实时URL时采取不同的策略。 如果您传递null(默认值),IronPDF将直接连接。
本指南涵盖您在生产中会遇到的每种代理场景:直接代理字符串、经过身份验证的企业代理、RenderUrlAsPdf解决方案、Docker容器配置、CI/CD管道集成,以及SSL拦截和NTLM身份验证的常见故障排除模式。
开始免费30天试用以测试您环境中的代理配置。
快速入门:通过代理渲染PDF
IronPDF的可选proxy参数有助于您转换由企业代理提供的实时网页。 使用此代码片段快速入门。
-
使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf
PM > Install-Package IronPdf -
复制并运行这段代码。
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"); -
部署到您的生产环境中进行测试
通过免费试用立即在您的项目中开始使用IronPDF
最小工作流程(3步)
- 通过NuGet安装IronPDF:
Install-Package IronPdf - 将代理字符串作为第三参数传递给
RenderHtmlAsPdf() - 格式:
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
当此参数为null(默认值)时,IronPDF的Chromium引擎直接连接到外部资源——样式表、图像、字体和JavaScript文件引用于您的HTML中。 当您提供代理字符串时,渲染引擎的所有HTTP/HTTPS请求都会通过该代理路由。
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"
)
代理字符串支持https://方案。 当代理本身要求对您的应用程序与代理服务器之间的连接进行TLS加密时,使用https://。 这里的方案指的是代理连接而不是最终资源——一个https://资源。
静态方法变体接受相同的代理参数,这对控制台应用程序或单元测试中的一次性渲染非常有用:
// 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"
)
重要:在ProxyAddress属性。 不要在那里寻找它。 代理严格来说是StaticRenderHtmlAsPdf重载上的方法参数。
如何与企业代理进行身份验证?
大多数企业代理需要凭证。 您可以使用http(s)://username:password@host:port格式直接将它们嵌入代理URL中:
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")
对密码中的特殊字符进行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.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"
不要将代理身份验证与网页身份验证混淆。NetworkPassword属性用于与正在渲染的网页进行身份验证(与网站进行NTLM/协商),而不是与代理服务器进行身份验证。 对于代理身份验证,凭证如上所示放在代理URL字符串中。
如何通过代理渲染URL?
RenderUrlAsPdf()不接受代理参数。 这是一个有意的API设计选择——RenderUrlAsPdf导航Chromium到一个URL,并且该导航的代理配置与HTML渲染期间的资源加载是不同的。
推荐的解决方案:使用配置了RenderHtmlAsPdf()并附带代理参数(这样引用的资产——图像、CSS、字体——也会通过代理路由)。
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
<link href="/css/styles.css">)正确解析。 proxy参数确保这些资产请求在渲染期间通过代理路由。
此模式也适用于需身份验证的页面 —— 在获取前使用适当的cookies或headers配置HttpClient,然后将经过身份验证的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.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"]
设置了这些环境变量后,您可以在没有代理参数的情况下调用RenderHtmlAsPdf() —— Chromium会自动拾取系统级配置:
// 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)
NO_PROXY对于内部资源很重要。 没有它,请求内部服务(如运行在Kubernetes集群内的本地CSS服务器或图像CDN)将不必要地通过代理路由。 用逗号分隔应绕过代理的主机名和域名。
如果您需要同时为一般流量设置系统级代理和特定渲染需要不同代理的,方法参数优先于环境变量。 这种方式在需要时为每个渲染提供了控制。
对于Kubernetes部署,通过ConfigMaps或在pod spec中的环境变量注入代理配置,而不是将其硬编码在Dockerfile中。这样,相同的容器映像可以在具有不同代理配置的环境中工作:
# 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"
当环境变量和方法参数都存在时,方法参数优先。 这为您提供了一种分层配置模型:在基础设施级别设置默认代理,当特定请求需要不同路由时可针对每个渲染进行覆盖。
如何在CI/CD管道中处理代理?
企业网络中的CI/CD运行器经常处于代理之后。 将代理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
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'
Jenkins(声明性管道):
environment {
HTTP_PROXY = credentials('corp-proxy-url')
HTTPS_PROXY = credentials('corp-proxy-url')
}
在这三种情况下,Chromium会自动读取环境变量。 如果您更喜欢显式控制,请从环境中读取代理URL,并将其作为方法参数传递:
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)
如何排除代理问题?
超时错误:企业代理增加了延迟。 将渲染超时从默认为60秒增加:
renderer.RenderingOptions.Timeout = 120; // seconds
renderer.RenderingOptions.Timeout = 120; // seconds
renderer.RenderingOptions.Timeout = 120 ' seconds
这是ChromePdfRenderOptions.Timeout属性——它控制Chromium等待页加载和资源提取的时间(合计)。 如果您的代理为每个请求增加5–10秒的延迟,并且页面加载了20多个外部资源,则60秒可能不够。
SSL拦截(中间人代理):许多企业代理通过公司根CA证书解密和重新加密HTTPS流量。 Chromium拒绝这些连接,因为它默认不信任公司CA。 两种解决方案:
- 在容器或主机的受信根存储中安装公司CA证书。 在Linux上:将
update-ca-certificates。 - 仅限于开发环境,您可以禁用证书验证——但永远不要在生产环境中这样做。 更安全的方法总是安装正确的证书。
NTLM身份验证:内嵌的user:pass@host格式支持基本和摘要代理身份验证。 NTLM(在Windows为中心的企业中很常见)通过代理URL字符串不受支持。 解决方法是在主机上或作为sidecar容器运行一个本地NTLM到基本转发代理,如CNTLM。 使用您的NTLM凭证配置CNTLM,然后将IronPDF指向http://localhost:3128(CNTLM的默认端口)。
空白PDF或丢失的资源:如果PDF渲染成功但图像/CSS丢失,说明您的HTML引用了代理阻止的资源或需要不同代理路径的资源。 验证baseUrlOrPath参数是否正确通过代理解析,并检查代理的访问日志中的403或407响应。
本地资源的代理绕过:如果您的HTML同时引用本地资源(捆绑图像、内联CSS)和远程资源(CDN字体、外部脚本),则代理只需处理远程请求。 将baseUrlOrPath设置为文件系统资源的本地目录,并让代理仅处理网络请求。 这样可以避免不必要地通过代理路由本地文件读取。
诊断连接性:在用IronPDF之前,要验证您的代理字符串是否正确,可先用简单的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
如果这成功但IronPDF仍然失败,问题很可能是SSL拦截或您的代理和Chromium的CONNECT隧道之间的协议不匹配。 检查代理是否支持HTTP CONNECT用于HTTPS资源——某些代理需要显式配置以允许隧道。
下一步
IronPDF中的代理支持是RenderHtmlAsPdf()上的方法参数——传递代理字符串,Chromium引擎会将所有HTTP流量通过它路由。 对于HTTPS_PROXY环境变量可以在不改变代码的情况下为您提供基础设施级控制。
浏览登录和身份验证指导以获取网页身份验证(与代理身份验证不同)的信息,HTTP请求头指南以获取自定义头,以及渲染选项参考以进行超时和性能优化。
查看许可选项起价为$749。ChromePdfRenderer API参考记录了每种方法重载,ChromePdfRenderOptions参考覆盖了所有可配置属性。
常见问题解答
如何在 C# 中为 PDF 渲染配置代理服务器?
要在 C# 中为 PDF 渲染配置代理服务器,可在调用 IronPDF 的 RenderHtmlAsPdf 方法时使用 proxy 参数。这允许您指定访问 Web 资源的代理设置。
在 IronPDF 中使用代理的目的是什么?
在渲染 PDF 时,配合 IronPDF 使用代理服务器有助于管理网络请求,特别是在互联网访问受限的环境中,例如防火墙后或企业内部网络中。
IronPDF 能否处理需要身份验证的代理?
是的,IronPDF 支持带身份验证的代理。您需要在 C# 代码中提供必要的身份验证凭据以及代理设置。
在 Docker 容器中能否通过代理使用 IronPDF?
是的,IronPDF 可以配置为在 Docker 容器中通过代理运行。请确保 Docker 环境变量设置正确,以传递代理设置。
如何排查 IronPDF 的代理问题?
若需排查 IronPDF 的代理问题,请检查代理设置,确保身份验证信息正确,并验证网络连接是否畅通。查看日志中的错误信息也有助于定位问题。
IronPDF 能否在配置了代理的 CI/CD 管道中使用?
是的,IronPDF 可以通过代理配置集成到 CI/CD 管道中。请确保您的构建环境已配置为在 PDF 渲染过程中传递必要的代理设置。
在 Enterprise 环境中,使用代理配合 IronPDF 有哪些优势?
在 Enterprise 环境中,配合 IronPDF 使用代理服务器可以增强安全性、控制互联网访问并管理带宽使用,从而更轻松地遵守组织的 IT 政策。

