4

我正在使用最近为 .NET 发布的新 WebView2 控件,我需要在导航到站点时向请求标头添加授权值,但我无法找到执行此操作的方法。由于这是控件相对较新并且我第一次使用它,我也可能完全错过了实际执行此操作的方法。

到目前为止,我能找到的唯一信息可以在 c++ 文档中找到:ICoreWebView2HttpRequestHeaders

它特别说

用于检查WebResourceRequested事件和 NavigationStarting 事件上的 HTTP 请求。请注意,您可以从 WebResourceRequested 事件修改HTTP 请求标头,但不能从 NavigationStarting 事件修改。

此事件在 .NET 中可用,我能够捕获它并查看请求标头,但它们似乎不可编辑,或者至少我试图错误地编辑它们。在我尝试编辑标头后,授权属性仍然为空,并且没有通过请求传递。

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;
}

如果有办法,设置此值的正确方法是什么,因为您似乎无法直接修改 eventargs。我也很可能错误地使用了这个事件。

任何帮助表示赞赏。

4

4 回答 4

1

当 WebView 对通过AddWebResourceRequestedFilter添加的匹配 URL 和资源上下文过滤器执行 URL 请求时,将引发WebResourceRequested事件。

在以下代码示例中,我处理了基本身份验证,可以通过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/");
}

在此处输入图像描述

于 2021-01-23T20:44:54.823 回答
1

原因是 WebResourceRequested 事件有微软希望修复的各种问题,并且已报告无法修改标头(见下文)。

例如:

无法在 WebResourceRequested 事件处理程序中设置标头 (与 Nic 的答案中给出的链接相同)

在 WebResourceRequested 事件中设置响应失败

无法在 WebResourceRequested 事件中设置标头或 cookie 失败

这里也部分提到: 支持在 WebView2 控件中获取和设置 cookie

因此,总而言之,您已经以正确的方式对其进行了编码,但是在 Microsoft 修复之前,您将无法从 WebResourceRequested 中设置授权标头。

我很欣赏这个答案没有提供解决方案,但我希望它至少能回答为什么代码目前不起作用的问题。

于 2020-06-23T23:24:09.187 回答
1

这是当前正在处理的 WebView2 上的一个已知错误:https ://github.com/MicrosoftEdge/WebViewFeedback/issues/259

如果您将来发现更多类似的错误,请随时在反馈回购中打开问题:https ://github.com/MicrosoftEdge/WebViewFeedback/issues

谢谢!

于 2020-06-20T04:19:11.257 回答
0

您可以使用

private void Navigate(string url, string uriAdditionalHeader)
{
  var httpMethodName = "GET"; // or "POST". As of now only GET and POST is supported as part of NavigateWithWebResourceRequest.

  var resourceRequest = this.coreWebView2.Environment.CreateWebResourceRequest(url, "GET", Stream.Null, **uriAdditionalHeader**);
  this.coreWebView2.NavigateWithWebResourceRequest(resourceRequest);
                
}

于 2021-12-01T11:11:10.987 回答