网络

本指南展示了如何使用与网络相关的功能,例如代理、网络事件、身份验证、TLS、客户端证书身份验证等。

可以通过使用 Profile.Network 属性获取的 INetwork 实例访问与网络相关的功能。 使用 IEngine.Network 属性,您将获得与默认 Profile 关联的 Network 实例。

接受语言

DotNetBrowser 允许使用 INetwork.AcceptLanguage 属性配置 Accept-Language。 输入参数值表示 Accept-Language HTTP 标头值。

例如,“fr, en-gb;q=0.8, en;q=0.7”值表示:“I prefer French, but will accept British English, and other types of English”:

network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7";
network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7"

服务器白名单

从 DotNetBrowser 1.9 开始,您可以配置 HTTP 服务器授权白名单,该白名单表示带有吧逗号/分号分隔的 URL 列表的字符串。 此功能允许您对列出的域使用集成 Windows 身份验证 (IWA) 和 Kerberos 身份验证。

借助 IWA,Chromium 可以在不提示用户输入用户名或密码的情况下向网络服务器或代理验证用户身份。 它通过使用缓存的凭据来实现这一点,这些凭据是在用户最初登录到运行浏览器的机器时建立的。 IWA 仅支持协商和 NTLM 质询。

ServerWhiteList 指定应将哪些服务器列入白名单以进行集成身份验证。 默认情况下,仅当存在来自此允许列表中的代理或服务器的身份验证质询时,才会启用集成身份验证。 如果未设置此列表,Chromium 引擎会尝试检测服务器是否位于内部网上,并仅响应内部网服务器的 IWA 请求。 如果服务器被检测为互联网,则忽略来自该服务器的 IWA 请求。

DelegateWhiteList 指定 Chromium 可以委托给的服务器。 如果未设置此列表,Chromium 不会委托用户凭据,即使服务器被检测为内部网。

如果在列表中指定多个服务器名称,请用逗号分隔它们。 允许使用通配符 (*)。

由于 Chromium 81 集成身份验证在隐身模式下被禁用。 在这种情况下,“AuthenticateHandler”处理程序将被调用以提供用户名和密码。 从 DotNetBrowser 2.23.3 开始,可以覆盖此行为。 为此,有必要添加 --ambient-authentication-in-private-modes-enabled Chromium 开关来覆盖 AmbientAuthenticationInPrivateModesEnabled 策略。

HTTP 服务器授权白名单

请参阅以下代码示例:

network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz"

HTTP 网络委托白名单

请参阅以下代码示例:

network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz"

TLS(传输层安全性协议)

证书验证

默认情况下,Chromium 验证网页加载期间从网络服务器获得的所有SSL证书。 DotNetBrowser 允许修改此默认行为并控制验证过程。

要处理证书验证,请使用 VerifyCertificateHandler 处理程序。 在它被调用之前,Chromium 验证 SSL 证书并将验证结果提供给处理程序。 处理程序会收到 SSL 证书本身以及验证结果。 您可以验证给定的 SSL 证书并通知引擎是否接受它。 请参阅下面的代码示例:

engine.Profiles.Default.Network.VerifyCertificateHandler
    = new Handler<VerifyCertificateParameters, VerifyCertificateResponse>(p =>
    {
        // SSL证书验证。
        Certificate certificate = p.Certificate;
        // 默认验证器执行的验证结果。
        IEnumerable<CertificateVerificationStatus> certificateStatuses =
            p.VerifyStatuses;
        // 应使用默认验证的结果。
        return VerifyCertificateResponse.Default();
    });
engine.Profiles.Default.Network.VerifyCertificateHandler = 
    New Handler(Of VerifyCertificateParameters, VerifyCertificateResponse)(Function(p)
        ' SSL证书验证。
        Dim certificate As Certificate = p.Certificate
        ' 默认验证器执行的验证结果。
        Dim certificateStatuses As IEnumerable(Of CertificateVerificationStatus) = 
            p.VerifyStatuses
        ' 应使用默认验证的结果。
        Return VerifyCertificateResponse.Default()
    End Function)

客户端证书认证

DotNetBrowser 支持使用 HTTPS 客户端证书进行身份验证。 有关详细信息,请参阅身份验证指南。

网络事件&处理程序

INetwork API 定义了遵循网络请求生命周期的一组事件和处理程序。 您可以使用这些事件观察和分析流量。 这些处理程序将允许您拦截,阻止或修改请求。

成功请求的事件生命周期如下所示: Network Events Flow

URL 请求前

SendUrlRequestHandler 处理程序在 HTTP 请求即将发生时被调用。 您可以使用此处理程序覆盖 URL 并将请求重定向到另一个位置。 例如:

network.SendUrlRequestHandler =
    new Handler<SendUrlRequestParameters, SendUrlRequestResponse>(p =>
    {
        return SendUrlRequestResponse.Override("<new-url>");
    });
network.SendUrlRequestHandler = 
    New Handler(Of SendUrlRequestParameters, SendUrlRequestResponse)(Function(p)
        Return SendUrlRequestResponse.Override("<new-url>")
    End Function)

发送上传数据之前

在将上传数据发送到网络服务器之前,请调用 SendUploadDataHandler 处理程序。 在这里,您可以覆盖上传数据。 例如:

network.SendUploadDataHandler =
    new Handler<SendUploadDataParameters, SendUploadDataResponse>(p =>
    {
        return SendUploadDataResponse.Override("<text-data>");
    });
network.SendUploadDataHandler = 
    New Handler(Of SendUploadDataParameters, SendUploadDataResponse)(Function(p)
        Return SendUploadDataResponse.Override("<text-data>")
    End Function)

如果请求没有上传数据,则不会调用此处理程序。

支持以下上传数据类型:

  • byte[] 代表一个字节序列;
  • string - text/plain 内容类型的数据;
  • FormData - application/x-www-form-urlencoded 内容类型的数据;
  • MultipartFormData - multipart/form-data 内容类型的数据。

交易开始之前

在网络交易开始之前,请调用 StartTransactionHandler 处理程序。 您可以在发送到网络服务器之前添加,修改和删除 HTTP 请求标头。 请参阅下面的代码示例:

network.StartTransactionHandler
    = new Handler<StartTransactionParameters, StartTransactionResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return StartTransactionResponse.OverrideHeaders(newHttpHeaders);
    });
network.StartTransactionHandler = 
    New Handler(Of StartTransactionParameters, StartTransactionResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = 
            headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return StartTransactionResponse.OverrideHeaders(newHttpHeaders)
    End Function)

目前未向处理程序提供以下标题:

- Authorization
- Cache-Control
- Connection
- Content-Length
- Host
- If-Modified-Since
- If-None-Match
- If-Range
- Partial-Data
- Pragma
- Proxy-Authorization
- Proxy-Connection
- Transfer-Encoding
请注意,我们不保证此列表完整或稳定。

接收标题

ReceiveHeadersHandler 处理程序在接收到标头时为 HTTP 请求调用。 您可以在此处添加、修改或删除通过网络接收的 HTTP 标头。 请参阅下面的代码示例:

network.ReceiveHeadersHandler =
    new Handler<ReceiveHeadersParameters, ReceiveHeadersResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return ReceiveHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.ReceiveHeadersHandler = 
    New Handler(Of ReceiveHeadersParameters, ReceiveHeadersResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = 
            headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return ReceiveHeadersResponse.OverrideHeaders(newHttpHeaders)
    End Function)

收到重定向响应代码

当收到请求的重定向响应代码 3xx 时,将发生 RedirectResponseCodeReceived 事件。 您可以获得有关重定向的详细信息,例如,新 URL 和响应代码。 请参阅下面的代码示例:

network.RedirectResponseCodeReceived += (s, e) => 
{
    string newUrl = e.NewUrl;
    int responseCode = e.ResponseCode;
};
AddHandler network.RedirectResponseCodeReceived, Sub(s, e)
    Dim newUrl As String = e.NewUrl
    Dim responseCode As Integer = e.ResponseCode
End Sub

响应开始

当收到 URL 响应主体的第一个字节时,会发生 ResponseStarted 事件。 对于HTTP请求,这意味着可以使用状态线和响应标头。 在此事件中,您可以访问相应的请求和响应代码。 请参阅下面的代码示例:

network.ResponseStarted += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
    int responseCode = e.ResponseCode;
};
AddHandler network.ResponseStarted, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
    Dim responseCode As Integer = e.ResponseCode
End Sub

请求完成

当 URL 请求已成功完成或失败时, 会发生 RequestCompleted 事件。 您可以检查请求是否已启动,获取请求状态的详细信息并访问响应代码。 请参阅下面的代码示例:

network.RequestCompleted += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
    // URL 请求状态的详细信息。
    RequestStatus urlRequestStatus = e.Status;
    // HTTP 响应代码。
    int responseCode = e.ResponseCode;
};
AddHandler network.RequestCompleted, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
    ' URL 请求状态的详细信息。
    Dim urlRequestStatus As RequestStatus = e.Status
    ' HTTP 响应代码。
    Dim responseCode As Integer = e.ResponseCode
End Sub

请求被销毁

当请求被销毁且无法再使用时,会发生 RequestDestroyed 事件。要访问销毁请求的详细信息, 请使用以下代码:

network.RequestDestroyed += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
};
AddHandler network.RequestDestroyed, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
End Sub

收到的响应字节

当通过网络接收 HTTP 响应主体的一部分时,会发生 ResponseBytesReceived 事件。它允许访问 HTTP 响应主体的字节:

network.ResponseBytesReceived += (s, e) => 
{
    byte[] data = e.Data;
};
AddHandler network.ResponseBytesReceived, Sub(s, e)
    Dim data() As Byte = e.Data
End Sub

PAC 脚本错误

PacScriptErrorOccurred 事件发生在 PAC 脚本出现错误时。它允许获取错误详细信息:

network.PacScriptErrorOccurred += (s, e) =>
{
    string errorText = e.ErrorText;
    uint lineNumber = e.LineNumber;
};
AddHandler network.PacScriptErrorOccurred, Sub(s, e)
    Dim errorText As String = e.ErrorText
    Dim lineNumber As UInteger = e.LineNumber
End Sub

连接状态

Chromium 内部跟踪互联网连接状态。当互联网连接被删除然后恢复时, Chromium 会检测到这一点, 并以编程方式重新加载当前加载的网页。您可以使用此 API 在网络连接状态更改时获得通知。

profile.Network.ConnectionTypeChanged += (s, e) =>
{
    ConnectionType connectionType = e.ConnectionType;
};
AddHandler profile.Network.ConnectionTypeChanged, Sub(s, e)
    Dim connectionType As ConnectionType = e.ConnectionType
End Sub
Go Top