Редактировать заголовок HTTP-запроса с помощью WebView2

Я использую новый элемент управления WebView2, который недавно был выпущен для .NET, и мне нужно добавить значение авторизации в заголовок запроса при переходе на сайт, но я не могу найти способ сделать это. Поскольку это элемент управления относительно новый и я использую его впервые, я также мог полностью упустить метод, который на самом деле это делает.

Единственная информация, которую я могу найти на данный момент, находится в документации по C ++: ICoreWebView2HttpRequestHeaders

В нем конкретно говорится

Используется для проверки HTTP-запроса на событие WebResourceRequested и событие NavigationStarting. Обратите внимание: вы можете изменить заголовки HTTP-запроса из события WebResourceRequested, но не из события NavigationStarting.

Это событие доступно в .NET, и я могу его поймать и увидеть заголовки запроса, но они не кажутся редактируемыми, или, по крайней мере, я пытаюсь отредактировать их неправильно. После того, как я попытаюсь отредактировать заголовок, свойство авторизации по-прежнему имеет значение null и не передается с запросом.

private void CoreWebView2_WebResourceRequested(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebResourceRequestedEventArgs e)
{
    var authHeaderValue = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "the_token_value");
    e.Request.Headers.Authorization = authHeaderValue;
}

Каков правильный способ, если есть способ, установить это значение, поскольку вы не можете напрямую изменять аргументы событий. Также очень вероятно, что я мог неправильно использовать это событие.

Любая помощь приветствуется.


person mindsurfer_BS    schedule 29.05.2020    source источник
comment
Свойство Request аргументов события является нормальным System.Net.Http.HttpRequestMessage. Предлагаю поискать, как установить заголовки на объект такого типа. Похоже, вы делаете это правильно, так почему вы подозреваете, что это неверно? Если вы получили ошибку, покажите ее. Если что-то еще, объясните   -  person pinkfloydx33    schedule 30.05.2020
comment
Ошибки нет. Когда я сказал, что это не кажется редактируемым, я имел в виду то, что, когда я проверяю аргументы события 'e' после того, как я его назначил, свойство авторизации по-прежнему имеет значение null, и токен не передается на сайт после это событие выполнено.   -  person mindsurfer_BS    schedule 30.05.2020
comment
Я в таком же затруднительном положении. Я обнаружил, что свойство Request в CoreWebView2WebResourceRequestedEventArgs возвращает другой экземпляр каждый раз, когда вы его запрашиваете. Так что изменять заголовки бессмысленно, потому что запрос, а вместе с ним и заголовки - это всего лишь копия реальных данных. Кажется, я не могу найти исходный код Microsoft.Web.WebView2, чтобы понять, почему это происходит.   -  person Michiel    schedule 10.06.2020


Ответы (3)


Это известная ошибка в WebView2, над которой в настоящее время работают: https://github.com/MicrosoftEdge/WebViewFeedback/issues/259

Если вы обнаружите больше подобных ошибок в будущем, не стесняйтесь открывать вопросы в репозитории отзывов: https://github.com/MicrosoftEdge/WebViewFeedback/issues

Спасибо!

person Nic Champagne Williamson    schedule 20.06.2020
comment
Проблема исправлена. Пример. - person Reza Aghaei; 23.01.2021

Причина в том, что событие WebResourceRequested имеет различные проблемы, которые Microsoft надеется исправить, и сообщается о невозможности изменить заголовки (см. Ниже).

Например:

Невозможно установить заголовки в обработчике событий WebResourceRequested (это та же ссылка, что и в ответе Ника. )

Ошибка установки ответа в событии WebResourceRequested

Невозможно установить заголовки или файлы cookie при сбое события WebResourceRequested

который также частично упоминается здесь: Поддержка получения и настройки файлов cookie в элементе управления WebView2

Итак, в заключение, вы правильно написали код, но вы не сможете установить заголовок авторизации из WebResourceRequested, пока он не будет исправлен Microsoft.

Я понимаю, что этот ответ не дает решения, но я надеюсь, что он, по крайней мере, отвечает на вопрос, почему код в настоящее время не работает.

person pipalot    schedule 23.06.2020

Событие WebResourceRequested возникает, когда WebView выполняет URL-запрос к соответствующему URL-адресу и фильтру контекста ресурса, который был добавлен с помощью AddWebResourceRequestedFilter.

В следующем примере кода я обработал базовую аутентификацию, которую можно проверить с помощью guest в качестве имени пользователя и пароля для этого URL: https://jigsaw.w3.org/HTTP/Basic/

private async void Form1_Load(object sender, EventArgs e)
{
    var authData = System.Text.Encoding.UTF8.GetBytes("guest:guest");
    var authHeader = $"Basic {Convert.ToBase64String(authData)}";

    await webView21.EnsureCoreWebView2Async();
    webView21.CoreWebView2.AddWebResourceRequestedFilter("https://jigsaw.w3.org/*", 
        Microsoft.Web.WebView2.Core.CoreWebView2WebResourceContext.All);

    webView21.CoreWebView2.WebResourceRequested += (obj, args) =>
    {
        args.Request.Headers.SetHeader("Authorization", authHeader);
    };
    webView21.CoreWebView2.Navigate("https://jigsaw.w3.org/HTTP/Basic/");
}

введите описание изображения здесь

person Reza Aghaei    schedule 23.01.2021