使用 WebView2 编辑 HTTP 请求 header

Edit HTTP Request header with WebView2

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

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

具体说

Used to inspect the HTTP request on WebResourceRequested event and NavigationStarting event. Note, you can modify the HTTP request headers from a WebResourceRequested event, but not from a NavigationStarting event.

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

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。我也很可能错误地使用了这个事件。

感谢任何帮助。

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

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

谢谢!

原因是 WebResourceRequested 事件有各种问题,Microsoft 希望能够解决这些问题,并且已报告无法修改 headers(见下文)。

例如:

Unable to set headers in WebResourceRequested event handler (与 Nic 的回答中给出的 link 相同)

Setting Response in WebResourceRequested event fails

Cannot set headers or cookies in WebResourceRequested event fails

这里也有部分提到: Support for getting and setting cookies in WebView2 control

总之,您的编码方式是正确的,但是在 Microsoft 修复它之前,您将无法从 WebResourceRequested 中设置授权 header。

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

WebResourceRequested event is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with 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/");
}

您可以使用

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