Partilhar via


Gestão personalizada de pedidos de rede

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:

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

Diagrama de sequência para modificar pedidos

  1. A aplicação anfitriã configura um WebResourceRequested filtro.
  2. A aplicação anfitriã define os processadores de eventos para WebResourceRequested e WebResourceResponseReceived.
  3. A aplicação anfitriã navega no controlo WebView2 para uma página Web.
  4. O controlo WebView2 cria um pedido para um recurso necessário para a página Web.
  5. O controlo WebView2 aciona um WebResourceRequested evento para a aplicação anfitriã.
  6. A aplicação anfitriã escuta e processa o WebResourceRequested evento.
  7. A aplicação anfitriã pode modificar os cabeçalhos neste momento. A aplicação anfitriã também pode diferir o evento, o WebResourceRequested que significa que a aplicação anfitriã pede mais tempo para decidir o que fazer.
  8. A pilha de rede WebView2 pode adicionar mais cabeçalhos (por exemplo, pode adicionar cookies e cabeçalhos de autorização).
  9. O controlo WebView2 envia o pedido para o servidor HTTP.
  10. O servidor HTTP envia a resposta para o controlo WebView2.
  11. O controlo WebView2 aciona o WebResourceResponseReceived evento.
  12. 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

Diagrama de sequência para substituir respostas

  1. A aplicação anfitriã configura um WebResourceRequested filtro.
  2. A aplicação anfitriã define os processadores de eventos para WebResourceRequested e WebResourceResponseReceived.
  3. A aplicação anfitriã navega no controlo WebView2 para uma página Web.
  4. O controlo WebView2 cria um pedido para um recurso necessário para a página Web.
  5. O controlo WebView2 aciona um WebResourceRequested evento para a aplicação anfitriã.
  6. A aplicação anfitriã escuta e processa o WebResourceRequested evento.
  7. A aplicação anfitriã define uma resposta para o WebResourceRequested processador de eventos. A aplicação anfitriã também pode diferir o evento, o WebResourceRequested que significa que a aplicação anfitriã pede mais tempo para decidir o que fazer.
  8. 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:

Resposta:

Confira também