Administración personalizada de solicitudes de red
El control WebView2 de Microsoft Edge le permite interactuar con las solicitudes de red y modificarlas. Puede proporcionar una respuesta o modificar la solicitud de red mediante los WebResourceRequested
eventos y WebResourceResponseReceived
. También hay una funcionalidad especial que le permite navegar con solicitudes de red específicas mediante NavigateWithWebResourceRequest API
.
En este artículo se describe cómo puede modificar las solicitudes de red. Use esta API y enfoque para:
- Cargue contenido de archivo local en la aplicación para agregar compatibilidad con la funcionalidad sin conexión.
- Bloquear contenido en una página web, como imágenes específicas.
- Ajuste la autenticación para páginas específicas.
Terminología:
Término | Definición |
---|---|
Interceptar | La aplicación host puede interceptar una solicitud que se envía desde el control WebView2 al servidor HTTP, leer o modificar la solicitud y, a continuación, enviar la solicitud sin cambios o modificada al servidor HTTP (o al código local en lugar del servidor HTTP). |
Anular | La aplicación host puede invalidar una respuesta que se envía desde el servidor HTTP al control WebView2 y enviar una respuesta personalizada al control WebView2 en lugar de a la respuesta original. |
Cuándo usar enfoques personalizados frente a básicos
El WebResourceRequested
evento es una API de bajo nivel que proporciona más control, pero requiere más codificación y es complicado de usar. Para algunos escenarios comunes, proporcionamos API que son más fáciles de usar y están optimizadas para esos escenarios específicos, y se recomienda usar esas API en lugar de las API que se describen en este artículo.
En lugar de usar las API WebResourceRequested, es preferible usar estos otros enfoques cuando sea factible:
- Autenticación básica
- Navegación general
- Administración de cookies en WebView2
- Establecer la cadena del agente de usuario. Vea UserAgent (propiedad).
Nota: En el caso de las direcciones URL con nombres de host virtuales, no se admite el uso del WebResourceRequested
evento. Esto se debe a que el WebResourceRequested
evento no se desencadena para el método SetVirtualHostNameToFolderMapping.
Cómo interactúan la aplicación host, el control WebView2 y el servidor HTTP
El control WebView2 se encuentra entre la aplicación host y el servidor HTTP. Cuando la aplicación host navega a un URI, el control WebView2 envía una solicitud al servidor HTTP. A continuación, el servidor HTTP envía una respuesta al control WebView2.
Interceptar una solicitud para supervisarla o modificarla
La aplicación host puede interceptar una solicitud que se envía desde el control WebView2 al servidor HTTP, leer o modificar la solicitud y, a continuación, enviar la solicitud sin cambios o modificada al servidor HTTP (o al código local en lugar del servidor HTTP).
Interceptar la solicitud permite personalizar el contenido del encabezado, la dirección URL o el método GET/POST. Es posible que la aplicación host quiera interceptar una solicitud para proporcionar contenido POST opcional como parte de la solicitud.
La aplicación host puede cambiar las propiedades de una solicitud mediante esta API:
Qué puede hacer con los encabezados
Un encabezado HTTP proporciona información importante y metadatos sobre una solicitud o respuesta. El cambio de encabezados permite realizar acciones eficaces en la red.
Se puede usar un encabezado de solicitud para indicar el formato de la respuesta (por ejemplo, los Accept-*
encabezados), establecer tokens de autenticación, leer y escribir cookies (información confidencial), modificar el agente de usuario, etc. Se puede usar un encabezado de respuesta para proporcionar más contexto de la respuesta.
Filtrado del evento WebResourceRequested en función de la dirección URL y el tipo de recurso
Para recibir WebResourceRequested
eventos, especifique filtros para las solicitudes en las que está interesada la aplicación host, en función de la dirección URL y el tipo de recurso.
Por ejemplo, supongamos que la aplicación host está intentando reemplazar imágenes. En este caso, la aplicación host solo está interesada en WebResourceRequested
eventos para imágenes. La aplicación host solo obtendría eventos para las imágenes especificando el resourceContext
filtro para las imágenes.
Otro ejemplo es si la aplicación host solo está interesada en todas las solicitudes que se encuentran en un sitio como https://example.com
. A continuación, la aplicación puede especificar un filtro https://example.com/*
de dirección URL para obtener eventos asociados a ese sitio.
Para obtener más información sobre cómo funciona el filtro de dirección URL, vea Comentarios del método > CoreWebView2.AddWebResourceRequestedFilter.
¿Por qué desea interceptar las solicitudes enviadas desde WebView2?
Interceptar las solicitudes enviadas desde WebView2 le permite configurar aún más la solicitud. Es posible que la aplicación host quiera proporcionar contenido opcional como parte de la solicitud que el control WebView2 no sabrá por sí solo. Algunos escenarios incluyen:
- Está iniciando sesión en una página y la aplicación tiene credenciales para que la aplicación pueda proporcionar el encabezado de autenticación sin que el usuario tenga que escribir esas credenciales.
- Quiere funcionalidad sin conexión en la aplicación para redirigir la dirección URL a una ruta de acceso de archivo local cuando no se detecta ninguna conexión a Internet.
- Quiere cargar contenido de archivo local en el servidor de solicitudes a través de una solicitud POST.
Secuencia para modificar solicitudes
- La aplicación host configura un
WebResourceRequested
filtro. - La aplicación host define los controladores de eventos para
WebResourceRequested
yWebResourceResponseReceived
. - La aplicación host navega el control WebView2 a una página web.
- El control WebView2 crea una solicitud para un recurso necesario para la página web.
- El control WebView2 desencadena un
WebResourceRequested
evento en la aplicación host. - La aplicación host escucha y controla el
WebResourceRequested
evento. - La aplicación host puede modificar los encabezados en este momento. La aplicación host también puede aplazar el
WebResourceRequested
evento, lo que significa que la aplicación host pide más tiempo para decidir qué hacer. - La pila de red WebView2 puede agregar más encabezados (por ejemplo, puede agregar cookies y encabezados de autorización).
- El control WebView2 envía la solicitud al servidor HTTP.
- El servidor HTTP envía la respuesta al control WebView2.
- El control WebView2 desencadena el
WebResourceResponseReceived
evento. - La aplicación host escucha el
WebResourceResponseReceived
evento y lo controla.
Ejemplo: Interceptación de una solicitud para supervisarla o modificarla
En el ejemplo siguiente, la aplicación host intercepta la solicitud de documento que se envía desde el control WebView2 al http://www.example.com
servidor HTTP, agrega un valor de encabezado personalizado y envía la solicitud.
// 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");
};
Invalidar una respuesta para reemplazarla de forma proactiva
De forma predeterminada, el servidor HTTP envía respuestas al control WebView2. La aplicación host puede invalidar una respuesta que se envía desde el servidor HTTP al control WebView2 y enviar una respuesta personalizada al control WebView2 en lugar de a la respuesta original.
Secuencia para invalidar respuestas
- La aplicación host configura un
WebResourceRequested
filtro. - La aplicación host define los controladores de eventos para
WebResourceRequested
yWebResourceResponseReceived
. - La aplicación host navega el control WebView2 a una página web.
- El control WebView2 crea una solicitud para un recurso necesario para la página web.
- El control WebView2 desencadena un
WebResourceRequested
evento en la aplicación host. - La aplicación host escucha y controla el
WebResourceRequested
evento. - La aplicación host establece una respuesta al controlador de
WebResourceRequested
eventos. La aplicación host también puede aplazar elWebResourceRequested
evento, lo que significa que la aplicación host pide más tiempo para decidir qué hacer. - El control WebView2 representa la respuesta como recurso.
Ejemplo: Invalidación de una respuesta para reemplazarla de forma proactiva
// 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;
};
Construcción de una solicitud personalizada y navegación con esa solicitud
El NavigateWithWebResourceRequest
método permite a la aplicación host navegar por el control WebView2 mediante un WebResourceRequest
personalizado . Puede usar esta API para crear una solicitud GET o POST que tenga encabezados y contenido personalizados. A continuación, el control WebView2 navegará mediante esta solicitud personalizada.
Ejemplo: Construcción de una solicitud personalizada y navegación con esa solicitud
// 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);
Supervisión de las solicitudes y respuestas a través del evento WebResourceResponseReceived
Puede supervisar las solicitudes y respuestas a través del WebResourceResponseReceived
evento para leer cualquier valor de encabezado.
Ejemplo: Supervisión de las solicitudes y respuestas a través del evento WebResourceResponseReceived
En este ejemplo se muestra cómo leer el valor del encabezado de autorización mediante la supervisión de las solicitudes y respuestas a través del WebResourceResponseReceived
evento.
En el código siguiente se muestra cómo se puede usar el WebResourceResponseReceived
evento.
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.
}
}
}
Introducción a la referencia de API
Petición:
- Método CoreWebView2.AddWebResourceRequestedFilter
- Método CoreWebView2.NavigateWithWebResourceRequest
- Método CoreWebView2.RemoveWebResourceRequestedFilter
- Evento CoreWebView2.WebResourceRequested
- Método CoreWebView2Environment.CreateWebResourceRequest
- Enumeración CoreWebView2WebResourceContext
-
CoreWebView2WebResourceRequest (clase)
Content
Headers
Method
Uri
-
CoreWebView2WebResourceRequestedEventArgs (clase)
Request
ResourceContext
Response
GetDeferral
Respuesta:
- Evento CoreWebView2.WebResourceResponseReceived
- CoreWebView2Environment.CreateWebResourceResponse (Método)
-
CoreWebView2WebResourceResponse (clase)
Content
Headers
ReasonPhrase
StatusCode
-
CoreWebView2WebResourceResponseReceivedEventArgs (clase)
Request
Response
-
CoreWebView2WebResourceResponseView (clase)
Headers
ReasonPhrase
StatusCode
GetContentAsync
Consulte también
- Llamada a código de lado nativo desde código del lado web
- Interoperabilidad web/nativa en Información general sobre las características y las API de WebView2.