WPF中WebView2无法拦截CSS内woff2重定向引发CORS错误求助
解决思路
1. 扩大拦截的资源范围与上下文
WebResourceRequested默认可能未覆盖字体类资源,需确保拦截过滤器包含字体MIME类型及所有资源上下文:
- 初始化WebView2时,添加覆盖所有资源类型和上下文的过滤器:
webView.CoreWebView2.AddWebResourceRequestedFilter("*/*", CoreWebView2WebResourceContext.All); - 也可精准指定字体类型:
"font/*",搭配CoreWebView2WebResourceContext.Fonts上下文,避免不必要的拦截。
2. 修正CSS中的资源路径
由于CSS是重定向返回的,其中的相对路径./assets/fonts/...会基于CSS的最终URL解析,可能导致字体请求的URL不在你的拦截规则范围内。
- 在拦截CSS请求的响应时,修改CSS内容,将相对路径替换为绝对路径(或符合你拦截规则的固定路径)。例如:
private async void WebView_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { if (e.Request.Uri.EndsWith(".css")) { // 获取原始CSS响应内容 var response = await e.Request.GetResponseAsync(); using var stream = response.Content; using var reader = new StreamReader(stream); var cssContent = await reader.ReadToEndAsync(); // 替换相对路径为绝对路径 var modifiedCss = cssContent.Replace("./assets/fonts/", "https://your-domain.com/assets/fonts/"); // 返回修改后的CSS var newResponse = webView.CoreWebView2.Environment.CreateWebResourceResponse( new MemoryStream(Encoding.UTF8.GetBytes(modifiedCss)), response.StatusCode, response.ReasonPhrase, response.Headers.ToString()); e.Response = newResponse; } }
3. 确保拦截器注册时机正确
拦截器必须在CoreWebView2初始化完成后注册,否则无法生效。例如在CoreWebView2InitializationCompleted事件中添加拦截逻辑:
private async void WebView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) { if (e.IsSuccess) { webView.CoreWebView2.AddWebResourceRequestedFilter("*/*", CoreWebView2WebResourceContext.All); webView.CoreWebView2.WebResourceRequested += WebView_WebResourceRequested; } }
4. 排查WebView2版本兼容性
部分旧版本WebView2存在子资源拦截的bug,建议升级到最新稳定版:
- 更新NuGet包中的
Microsoft.Web.WebView2版本 - 安装最新的WebView2 Runtime
5. 临时绕开CORS(仅用于调试)
若拦截问题暂时无法解决,可通过修改WebView2的CORS策略临时测试:
webView.CoreWebView2.Settings.IsWebSecurityEnabled = false;
注意:此设置会关闭Web安全,仅适合调试,生产环境禁用。
内容的提问来源于stack exchange,提问作者Dsg951
相关产品推荐
相关产品推荐

