使用WebView2导航URL时能否拦截处理页面加载的JSON文件?
实现结论
完全可以获取页面加载过程中请求的JSON等各类资源内容,不需要依赖读取WebView2缓存,使用WebView2原生提供的网络资源拦截API即可稳定实现全请求过滤、匹配规则后读取响应内容的需求。
NavigationCompleted事件仅会响应主文档的导航完成动作,页面运行过程中发起的XHR、Fetch、CSS、JS、图片、媒体等子资源请求都不会触发该事件,自然无法通过该事件捕获子资源内容。
具体实现步骤
所有配置需要在WebView2初始化完成、首次执行导航操作前完成,避免遗漏早期发起的资源请求。
- 添加资源拦截过滤规则
先通过AddWebResourceRequestedFilter配置需要监听的URL范围和资源类型,示例代码如下:// WebView2初始化完成后执行配置 await webView2.EnsureCoreWebView2Async(); // 添加过滤规则:第一个参数是URL匹配通配符,第二个参数是要拦截的资源上下文 webView2.CoreWebView2.AddWebResourceRequestedFilter( "*", // 可替换为自定义规则,比如"https://target-domain.com/api/*"缩小监听范围 CoreWebView2WebResourceContext.All // 选择All即可覆盖所有类型资源,包含JSON请求常用的Fetch、XmlHttpRequest上下文 ); - 注册资源请求事件捕获响应内容
监听WebResourceRequested事件,在事件回调中匹配自定义URL规则,匹配成功即可读取对应响应的内容,示例代码如下:webView2.CoreWebView2.WebResourceRequested += (sender, args) => { // 自定义匹配规则,比如判断请求后缀为json、或路径属于接口路径 bool isTargetJson = args.Request.Uri.EndsWith(".json") || args.Request.Uri.Contains("/api/data/"); if (isTargetJson && args.Response != null) { // 读取响应流内容 using var responseStream = args.Response.Content; using var streamReader = new StreamReader(responseStream); string jsonContent = streamReader.ReadToEnd(); // 此处即可拿到目标JSON的完整文本内容,可直接做后续解析处理 // 注意:不要在该回调中执行阻塞式耗时操作,避免影响页面正常加载 } }; - 注意事项
读取内容过程中不要修改args.Response的属性、不要重新给args.Response赋值,避免破坏页面原始资源加载流程,导致页面渲染异常。如果遇到内容编码异常,可从args.Response.Headers中读取Content-Type头指定的编码格式,再初始化对应编码的StreamReader即可。
不推荐读取缓存的原因
不建议通过读取WebView2本地缓存的方式获取资源内容:
- WebView2的缓存遵循Chromium的存储逻辑,采用分片、加密方式存储,没有公开稳定的对外读取API,不同WebView2版本的缓存结构可能发生变化,兼容成本极高
- 大量动态JSON接口请求会携带
Cache-Control: no-cache相关头,根本不会写入本地磁盘缓存,读取缓存的方案无法覆盖这类请求,成功率极低
内容的提问来源于stack exchange,提问作者Nime Cloud
相关产品推荐
相关产品推荐

