使用 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);
}
我正在使用最近为 .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);
}