Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O controlo Microsoft Edge WebView2 permite-lhe interagir e modificar pedidos de rede. Pode fornecer uma resposta ou modificar o pedido de rede com os WebResourceRequested eventos e WebResourceResponseReceived . Também existe uma funcionalidade especial que lhe permite navegar com pedidos de rede específicos com o NavigateWithWebResourceRequest API.
Este artigo descreve como pode modificar pedidos de rede. Utilize esta API e abordagem a:
- Carregue o conteúdo do ficheiro local para a sua aplicação para adicionar suporte para a funcionalidade offline.
- Bloquear conteúdo numa página Web, como imagens específicas.
- Otimizar a autenticação para páginas específicas.
Terminologia:
| Termo | Definição |
|---|---|
| intercetar | A aplicação anfitriã pode intercetar um pedido enviado a partir do controlo WebView2 para o servidor HTTP, ler ou modificar o pedido e, em seguida, enviar o pedido inalterado ou modificado para o servidor HTTP (ou para o código local em vez do servidor HTTP). |
| substituir | A aplicação anfitriã pode substituir uma resposta enviada do servidor HTTP para o controlo WebView2 e enviar uma resposta personalizada para o controlo WebView2 em vez da resposta original. |
Quando utilizar abordagens personalizadas vs. básicas
O WebResourceRequested evento é uma API de baixo nível que dá mais controlo, mas requer mais codificação e é complicado de utilizar. Para alguns cenários comuns, fornecemos APIs mais fáceis de utilizar e otimizadas para esses cenários específicos e recomendamos que utilize essas APIs em vez das APIs abordadas neste artigo.
Em vez de utilizar as APIs WebResourceRequested, é preferível utilizar estas outras abordagens quando possível:
- Autenticação Básica
- Navegação geral
- Gerir cookies no WebView2
- Definir a cadeia do agente de utilizador. Veja Propriedade UserAgent.
Nota: Para URLs com nomes de anfitrião virtuais, a utilização do WebResourceRequested evento não é suportada. Isto acontece porque o WebResourceRequested evento não é acionado para o método SetVirtualHostNameToFolderMapping.
Como a aplicação anfitriã, o controlo WebView2 e o servidor HTTP interagem
O controlo WebView2 encontra-se entre a aplicação anfitriã e o servidor HTTP. Quando a aplicação anfitriã navega para um URI, o controlo WebView2 envia um pedido para o servidor HTTP. Em seguida, o servidor HTTP envia uma resposta para o controlo WebView2.
Intercetar um pedido, para monitorizá-lo ou modificá-lo
A aplicação anfitriã pode intercetar um pedido enviado a partir do controlo WebView2 para o servidor HTTP, ler ou modificar o pedido e, em seguida, enviar o pedido inalterado ou modificado para o servidor HTTP (ou para o código local em vez do servidor HTTP).
Intercetar o pedido permite-lhe personalizar o conteúdo do cabeçalho, o URL ou o método GET/POST. A aplicação anfitriã poderá querer intercetar um pedido para fornecer conteúdo POST opcional como parte do pedido.
A aplicação anfitriã pode alterar as propriedades de um pedido com esta API:
O que pode fazer com cabeçalhos
Um cabeçalho HTTP fornece informações e metadados importantes sobre um pedido ou resposta. Alterar cabeçalhos permite-lhe realizar ações poderosas na rede.
Um cabeçalho de pedido pode ser utilizado para indicar o formato da resposta (como os Accept-* cabeçalhos), definir tokens de autenticação, ler e escrever cookies (informações confidenciais), modificar o agente do utilizador, etc. Um cabeçalho de resposta pode ser utilizado para fornecer mais contexto da resposta.
Filtrar o evento WebResourceRequested com base no URL e no tipo de recurso
Para receber WebResourceRequested eventos, especifique filtros para os pedidos nos quais a aplicação anfitriã está interessada, com base no URL e no tipo de recurso.
Por exemplo, suponha que a aplicação anfitriã está a tentar substituir imagens. Neste caso, a aplicação anfitriã só está interessada em WebResourceRequested eventos para imagens. A aplicação anfitriã só obteria eventos para imagens ao especificar o resourceContext filtro para imagens.
Outro exemplo é se a aplicação anfitriã só estiver interessada em todos os pedidos que estejam num site como https://example.com. Em seguida, a aplicação pode especificar um filtro de URL para https://example.com/* obter eventos associados a esse site.
Para obter detalhes sobre como funciona o filtro de URL, veja CoreWebView2.AddWebResourceRequestedFilter Method Remarks (Observações do Método CoreWebView2.AddWebRequestedFilter)>
Por que motivo pretende intercetar pedidos enviados a partir do WebView2?
Intercetar pedidos enviados a partir do WebView2 permite-lhe configurar ainda mais o pedido. A aplicação anfitriã poderá querer fornecer conteúdo opcional como parte do pedido que o controlo WebView2 não saberá por si só. Alguns cenários incluem:
- Está a iniciar sessão numa página e a aplicação tem credenciais para que a aplicação possa fornecer um cabeçalho de autenticação sem que o utilizador tenha de introduzir essas credenciais.
- Quer a funcionalidade offline na aplicação para redirecionar o URL para um caminho de ficheiro local quando não for detetada nenhuma ligação à Internet.
- Quer carregar o conteúdo do ficheiro local para o servidor de pedidos através de um pedido POST.
Sequência para modificar pedidos
- A aplicação anfitriã configura um
WebResourceRequestedfiltro. - A aplicação anfitriã define os processadores de eventos para
WebResourceRequestedeWebResourceResponseReceived. - A aplicação anfitriã navega no controlo WebView2 para uma página Web.
- O controlo WebView2 cria um pedido para um recurso necessário para a página Web.
- O controlo WebView2 aciona um
WebResourceRequestedevento para a aplicação anfitriã. - A aplicação anfitriã escuta e processa o
WebResourceRequestedevento. - A aplicação anfitriã pode modificar os cabeçalhos neste momento. A aplicação anfitriã também pode diferir o evento, o
WebResourceRequestedque significa que a aplicação anfitriã pede mais tempo para decidir o que fazer. - A pilha de rede WebView2 pode adicionar mais cabeçalhos (por exemplo, pode adicionar cookies e cabeçalhos de autorização).
- O controlo WebView2 envia o pedido para o servidor HTTP.
- O servidor HTTP envia a resposta para o controlo WebView2.
- O controlo WebView2 aciona o
WebResourceResponseReceivedevento. - A aplicação anfitriã escuta o evento e processa-o
WebResourceResponseReceived.
Exemplo: Intercetar um pedido, para monitorizá-lo ou modificá-lo
No exemplo seguinte, a aplicação anfitriã interceta o pedido de documento que é enviado do controlo WebView2 para o http://www.example.com servidor HTTP, adiciona um valor de cabeçalho personalizado e envia o pedido.
// Add a filter to select all resource types under http://www.example.com
webView.CoreWebView2.AddWebResourceRequestedFilter(
"http://www.example.com/*", CoreWebView2WebResourceContext.All);
webView.CoreWebView2.WebResourceRequested += delegate (
object sender, CoreWebView2WebResourceRequestedEventArgs args) {
CoreWebView2WebResourceContext resourceContext = args.ResourceContext;
// Only intercept the document resources
if (resourceContext != CoreWebView2WebResourceContext.Document)
{
return;
}
CoreWebView2HttpRequestHeaders requestHeaders = args.Request.Headers;
requestHeaders.SetHeader("Custom", "Value");
};
Substituir uma resposta, para substituí-la proativamente
Por predefinição, o servidor HTTP envia respostas para o controlo WebView2. A aplicação anfitriã pode substituir uma resposta enviada do servidor HTTP para o controlo WebView2 e enviar uma resposta personalizada para o controlo WebView2 em vez da resposta original.
Sequência para substituir respostas
- A aplicação anfitriã configura um
WebResourceRequestedfiltro. - A aplicação anfitriã define os processadores de eventos para
WebResourceRequestedeWebResourceResponseReceived. - A aplicação anfitriã navega no controlo WebView2 para uma página Web.
- O controlo WebView2 cria um pedido para um recurso necessário para a página Web.
- O controlo WebView2 aciona um
WebResourceRequestedevento para a aplicação anfitriã. - A aplicação anfitriã escuta e processa o
WebResourceRequestedevento. - A aplicação anfitriã define uma resposta para o
WebResourceRequestedprocessador de eventos. A aplicação anfitriã também pode diferir o evento, oWebResourceRequestedque significa que a aplicação anfitriã pede mais tempo para decidir o que fazer. - O controlo WebView2 compõe a resposta como recurso.
Exemplo: Substituir uma resposta, para a substituir proativamente
// Add a filter to select all image resources
webView.CoreWebView2.AddWebResourceRequestedFilter(
"*", CoreWebView2WebResourceContext.Image);
webView.CoreWebView2.WebResourceRequested += delegate (
object sender, CoreWebView2WebResourceRequestedEventArgs args) {
// Replace the remote image resource with a local one specified at the path customImagePath.
// If response is not set, the request will continue as it is.
FileStream fs = File.Open(customImagePath, FileMode.Open);
CoreWebView2WebResourceResponse response = webView.CoreWebView2.Environment.CreateWebResourceResponse(fs, 200, "OK", "Content-Type: image/jpeg");
args.Response = response;
};
Construir um pedido personalizado e navegar com esse pedido
O NavigateWithWebResourceRequest método permite que a aplicação anfitriã navegue no controlo WebView2 com um personalizado WebResourceRequest. Pode utilizar esta API para criar um pedido GET ou POST que tenha cabeçalhos e conteúdos personalizados. Em seguida, o controlo WebView2 navegará através deste pedido personalizado.
Exemplo: Construir um pedido personalizado e navegar com esse pedido
// This code posts text input=Hello to the POST form page in W3Schools.
// Need to convert post data to UTF-8 as required by the application/x-www-form-urlencoded Content-Type
UTF8Encoding utfEncoding = new UTF8Encoding();
byte[] postData = utfEncoding.GetBytes("input=Hello");
MemoryStream postDataStream = new MemoryStream(postData.Length);
postDataStream.Write(postData, 0, postData.Length);
postDataStream.Seek(0, SeekOrigin.Begin);
// This acts as a HTML form submit to https://www.w3schools.com/action_page.php
CoreWebView2WebResourceRequest webResourceRequest =
environment.CreateWebResourceRequest("https://www.w3schools.com/action_page.php",
"POST",
postDataStream,
"Content-Type: application/x-www-form-urlencoded");
webView.CoreWebView2.NavigateWithWebResourceRequest(webResourceRequest);
Monitorizar os pedidos e respostas através do evento WebResourceResponseReceived
Pode monitorizar os pedidos e as respostas através do WebResourceResponseReceived evento para ler qualquer valor de cabeçalho.
Exemplo: Monitorizar os pedidos e respostas através do evento WebResourceResponseReceived
Este exemplo mostra como ler o valor do cabeçalho de autorização ao monitorizar os pedidos e as respostas através do WebResourceResponseReceived evento.
O código seguinte demonstra como o WebResourceResponseReceived evento pode ser utilizado.
WebView.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived;
// Note: modifications made to request are set but have no effect on WebView processing it.
private async void WebView_WebResourceResponseReceived(object sender, CoreWebView2WebResourceResponseReceivedEventArgs e)
{
// Actual headers sent with request
foreach (var current in e.Request.Headers)
{
Console.WriteLine(current);
}
// Headers in response received
foreach (var current in e.Response.Headers)
{
Console.WriteLine(current);
}
// Status code from response received
int status = e.Response.StatusCode;
if (status == 200)
{
Console.WriteLine("Request succeeded!");
// Get response body
try
{
System.IO.Stream content = await e.Response.GetContentAsync();
// Null will be returned if no content was found for the response.
if (content != null)
{
DoSomethingWithResponseContent(content);
}
}
catch (COMException ex)
{
// A COMException will be thrown if the content failed to load.
}
}
}
Descrição geral da Referência da API
Pedido:
- Método CoreWebView2.AddWebResourceRequestedFilter
- CoreWebView2.NavigateWithWebResourceRequest Method
- Método CoreWebView2.RemoveWebResourceRequestedFilter
- Evento CoreWebView2.WebResourceRequested
- CoreWebView2Environment.CreateWebResourceRequest Method
- CoreWebView2WebResourceContext Enumeração
-
Classe CoreWebView2WebResourceRequest
ContentHeadersMethodUri
-
Classe CoreWebView2WebResourceRequestedEventArgs
RequestResourceContextResponseGetDeferral
Resposta:
- Evento CoreWebView2.WebResourceResponseReceived
- Método CoreWebView2Environment.CreateWebResourceResponse
-
Classe CoreWebView2WebResourceResponse
ContentHeadersReasonPhraseStatusCode
-
Classe CoreWebView2WebResourceResponseReceivedEventArgs
RequestResponse
-
Classe CoreWebView2WebResourceResponseView
HeadersReasonPhraseStatusCodeGetContentAsync
Confira também
- Chamar código do lado nativo a partir do código do lado da Web
- Interoperabilidade Web/nativa na Descrição Geral das APIs WebView2.