Introdução
Instalação
Guias
- Engine
- Perfil
- Navegador
- BrowserView
- Navegação
- Conteúdo
- Menu de contexto
- DOM
- JavaScript
- Pop-ups
- Diálogos
- Downloads
- Rede
- Cache
- Cookies
- Proxy
- Autenticação
- Permissões
- Plugins
- Impressão
- Senhas
- Perfis de dados do usuário
- Cartões de crédito
- Mídia
- Zoom
- Corretor ortográfico
- Implantação
- Chromium
Resolução de problemas
- Registro
- Exceções comuns
- A aplicação não termina
- O vídeo não é reproduzido
- Não é possível iniciar sessão na conta Google
- Os dados do usuário não são armazenados
- Esquema de cores
- Falha no início
- Início lento no Windows
- Aplicação .NET que não responde
- Encerramento inesperado do processo Chromium
- Comportamento inesperado
- Fim do suporte do Windows 7/8/8.1
Migração
Rede
Este guia mostra como trabalhar com a funcionalidade relacionada com a rede, como proxy, eventos de rede, autenticação, TLS, autenticação de certificado de cliente, etc.
A funcionalidade relacionada com a rede pode ser acedida através da instância INetwork
que pode ser obtida utilizando a propriedade Profile.Network
. Utilizando a propriedade IEngine.Network
, você obterá a instância Network
associada ao Profile
predefinido.
Aceitar o idioma
O DotNetBrowser permite configurar a Accept-Language
utilizando a propriedade INetwork.AcceptLanguage
. O valor do parâmetro de entrada representa o valor do cabeçalho HTTP Accept-Language
.
Por exemplo, o valor “fr, en-gb;q=0.8, en;q=0.7” significaria: “Prefiro o francês, mas aceito o inglês britânico e outros tipos de inglês”:
network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7";
network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7"
ServerWhiteList
Desde o DotNetBrowser 1.9, é possível configurar a lista branca de autorização do servidor HTTP que representa uma string com uma lista de URLs separada por vírgula/semicolon. Esta funcionalidade permite-lhe utilizar a autenticação integrada do Windows (IWA) e a autenticação Kerberos para os domínios listados.
Com o IWA, o Chromium pode autenticar o usuário num servidor Web ou proxy sem sequer pedir ao usuário um nome de usuário ou uma senha. Para tal, ele utiliza credenciais em cache que são estabelecidas quando o usuário inicia uma sessão na máquina em que o navegador está sendo executado. O IWA é suportado apenas para os desafios Negotiate e NTLM.
O ServerWhiteList
especifica quais os servidores que devem ser incluídos na lista branca para autenticação integrada. Por padrão, a autenticação integrada só é ativada quando existe um desafio de autenticação de um proxy ou de um servidor que esteja nesta lista permitida. Se esta lista não estiver definida, o engine Chromium tenta detectar se um servidor está na Intranet e responde aos pedidos IWA apenas para os servidores da Intranet. Se um servidor for detectado como Internet, os pedidos IWA deste servidor são ignorados.
O DelegateWhiteList
especifica os servidores aos quais o Chromium pode delegar. Se esta lista não estiver definida, o Chromium não delega credenciais de usuário mesmo que um servidor seja detectado como Intranet.
Se você especificar vários nomes de servidores na lista, separe-os por vírgulas. São permitidos caracteres coringa (*).
Desde o Chromium 81, a autenticação integrada está desativada no modo de navegação anônima. Neste caso, o handler AuthenticateHandler
será invocado para fornecer o nome de usuário e a senha. Desde o DotNetBrowser 2.23.3, é possível substituir esse comportamento. Para este efeito, é necessário adicionar o interrutor do Chromium --ambient-authentication-in-private-modes-enabled
para substituir a política AmbientAuthenticationInPrivateModesEnabled.
Lista branca de autorização do servidor HTTP
Veja o exemplo de código abaixo:
network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz"
Lista branca para delegar da rede HTTP
Veja o exemplo de código abaixo:
network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz"
TLS
Verificação do certificado
Por padrão, o Chromium verifica todos os certificados SSL obtidos de um servidor Web durante o carregamento da página Web. O DotNetBrowser permite modificar este comportamento por padrão e assumir o controle do processo de verificação.
Para tratar da verificação de certificados, utilize o handler VerifyCertificateHandler
. Antes de ser invocado, o Chromium verifica o certificado SSL e fornece os resultados da verificação ao handler. O handler recebe o próprio certificado SSL juntamente com os resultados da verificação. Você pode verificar o certificado SSL fornecido e notificar o engine se o aceita ou não. Veja o exemplo de código abaixo:
engine.Profiles.Default.Network.VerifyCertificateHandler
= new Handler<VerifyCertificateParameters, VerifyCertificateResponse>(p =>
{
// Certificado SSL a verificar.
Certificate certificate = p.Certificate;
// Os resultados da verificação efetuada pelo verificador predefinido.
IEnumerable<CertificateVerificationStatus> certificateStatuses =
p.VerifyStatuses;
// Devem ser utilizados os resultados da verificação por padrão.
return VerifyCertificateResponse.Default();
});
engine.Profiles.Default.Network.VerifyCertificateHandler =
New Handler(Of VerifyCertificateParameters, VerifyCertificateResponse)(Function(p)
' Certificado SSL para verificar.
Dim certificate As Certificate = p.Certificate
' Os resultados da verificação efetuada pelo verificador predefinido.
Dim certificateStatuses As IEnumerable(Of CertificateVerificationStatus) =
p.VerifyStatuses
' Devem ser utilizados os resultados da verificação por padrão.
Return VerifyCertificateResponse.Default()
End Function)
Autenticação do certificado do cliente
O DotNetBrowser suporta autenticação usando certificados de cliente HTTPS. Consulte o guia Autenticação para obter detalhes.
Eventos de rede e handlers
A API INetwork
define um conjunto de eventos e handlers que seguem o ciclo de vida de um pedido Web. Você pode utilizar estes eventos para observar e analisar o tráfego. Estes handlers permitem-lhe interceptar, bloquear ou modificar pedidos.
O ciclo de vida dos eventos de pedidos bem sucedidos é o seguinte:
Antes do pedido de URL
O handler SendUrlRequestHandler
é invocado quando um pedido HTTP está prestes a ocorrer. Você pode utilizar este handler para substituir o URL e redirecionar o pedido para outra localização. Por exemplo:
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)
Antes de enviar dados de carregamento
O handler SendUploadDataHandler
é invocado antes de os dados de carregamento serem enviados para um servidor Web. Aqui você pode substituir os dados de carregamento. Por exemplo:
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)
Este handler não será chamado se o pedido não tiver os dados de carregamento.
São suportados os seguintes tipos de dados de carregamento:
byte[]
representa uma sequência de bytes;string
- os dados do tipo de conteúdotext/plain
;FormData
- os dados do tipo de conteúdoapplication/x-www-form-urlencoded
;MultipartFormData
- os dados do tipo de conteúdomultipart/form-data
.
Antes de iniciar a transação
O StartTransactionHandler
handler é invocado antes do início da transação de rede. Você pode adicionar, modificar e eliminar os cabeçalhos dos pedidos HTTP antes de serem enviados para um servidor Web. Veja o exemplo de código abaixo:
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)
Os seguintes cabeçalhos não são atualmente fornecidos ao handler:
- Authorization
- Cache-Control
- Connection
- Content-Length
- Host
- If-Modified-Since
- If-None-Match
- If-Range
- Partial-Data
- Pragma
- Proxy-Authorization
- Proxy-Connection
- Transfer-Encoding
Note que não garantimos que esta lista esteja completa ou estável.
Receber cabeçalhos
O handler ReceiveHeadersHandler
é invocado para pedidos HTTP quando os cabeçalhos são recebidos. Aqui você pode adicionar, modificar ou remover os cabeçalhos HTTP recebidos através da rede. Veja o exemplo de código abaixo:
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)
Redirecionar código de resposta recebido
O evento RedirectResponseCodeReceived
ocorre quando é recebido um código de resposta de redirecionamento 3xx
para o pedido. Você pode obter os detalhes sobre o redirecionamento, como o novo URL e o código de resposta. Veja o exemplo de código abaixo:
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
Resposta iniciada
O evento ResponseStarted
ocorre quando o primeiro byte do corpo da resposta URL é recebido. Para pedidos HTTP, significa que a linha de estado e os cabeçalhos de resposta estão disponíveis. Neste evento, é possível acessar o pedido correspondente e o código de resposta. Veja o exemplo de código abaixo:
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
Pedido concluído
O evento RequestCompleted
ocorre quando o pedido de URL foi concluído com êxito ou falhou. É possível verificar se o pedido foi iniciado, obter os detalhes do estado do pedido e acessar o código de resposta. Veja o exemplo de código abaixo:
network.RequestCompleted += (s, e) =>
{
UrlRequest urlRequest = e.UrlRequest;
// Os detalhes do estado do pedido de URL.
RequestStatus urlRequestStatus = e.Status;
// O código de resposta HTTP.
int responseCode = e.ResponseCode;
};
AddHandler network.RequestCompleted, Sub(s, e)
Dim urlRequest As UrlRequest = e.UrlRequest
' Os detalhes do estado do pedido de URL.
Dim urlRequestStatus As RequestStatus = e.Status
' O código de resposta HTTP.
Dim responseCode As Integer = e.ResponseCode
End Sub
Pedido destruído
O evento RequestDestroyed
ocorre quando o pedido foi destruído e já não pode ser utilizado. Para acessar os detalhes do pedido destruído, utilize o seguinte código:
network.RequestDestroyed += (s, e) =>
{
UrlRequest urlRequest = e.UrlRequest;
};
AddHandler network.RequestDestroyed, Sub(s, e)
Dim urlRequest As UrlRequest = e.UrlRequest
End Sub
Bytes de resposta recebidos
O evento ResponseBytesReceived
ocorre quando uma parte do corpo da resposta HTTP é recebida através da rede. Ele permite acessar os bytes do corpo da resposta HTTP:
network.ResponseBytesReceived += (s, e) =>
{
byte[] data = e.Data;
};
AddHandler network.ResponseBytesReceived, Sub(s, e)
Dim data() As Byte = e.Data
End Sub
Erro de script PAC
O evento PacScriptErrorOccurred
ocorre quando há um erro no script PAC. Ele permite obter os pormenores do erro:
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
Estado da conexão
O Chromium monitoriza internamente o estado da ligação à Internet. Quando a ligação à Internet é interrompida e depois restabelecida, o Chromium detecta este fato e recarrega programaticamente a página Web atualmente carregada. Você pode obter notificações quando o estado da ligação de rede é alterado utilizando esta 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