如何通过C# WPF WebBrowser控件捕获API返回的原始JSON响应?
如何通过WebBrowser控件查看网页请求的原始JSON响应
我明白你想要像Chrome开发者工具那样,直接查看WebBrowser控件加载页面时发起的API请求返回的原始JSON——可惜WebBrowser本身并没有内置的“网络面板”功能,不过我们有几种变通的方法可以实现这个需求,下面给你详细讲讲:
方法一:注入JavaScript监听AJAX请求(最适合捕获页面内的异步API请求)
如果网页是通过XMLHttpRequest或者fetch发起的AJAX请求,我们可以给页面注入一段自定义的JS代码,拦截这些请求并捕获响应内容。以.NET的WebBrowser控件为例,你可以在DocumentCompleted事件里做这件事:
首先,在控件的DocumentCompleted事件中注入监听脚本:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // 注入一段脚本,拦截XMLHttpRequest和fetch请求 string interceptScript = @" (function() { // 拦截XMLHttpRequest const originalXHR = XMLHttpRequest; XMLHttpRequest = function() { const xhr = new originalXHR(); const originalOnLoad = xhr.onload; xhr.onload = function() { const contentType = xhr.getResponseHeader('Content-Type'); if (contentType?.includes('application/json')) { // 把JSON响应存到全局变量,方便C#端获取 window.capturedJson = xhr.responseText; } originalOnLoad?.apply(this, arguments); }; return xhr; }; // 同时拦截fetch请求(如果页面用了fetch) const originalFetch = window.fetch; window.fetch = async function(...args) { const response = await originalFetch(...args); if (response.headers.get('Content-Type')?.includes('application/json')) { // 克隆响应流,避免原请求无法读取 const clonedResponse = response.clone(); window.capturedJson = await clonedResponse.text(); } return response; }; })(); "; // 执行注入的脚本 webBrowser1.Document.InvokeScript("eval", new object[] { interceptScript }); }
之后当你需要获取捕获到的JSON时,只需要调用这段代码:
// 从全局变量中取出JSON string rawJson = webBrowser1.Document.InvokeScript("eval", new object[] { "window.capturedJson" }) as string; if (!string.IsNullOrEmpty(rawJson)) { // 这里可以显示JSON内容,比如输出到控制台或者文本框 Console.WriteLine(rawJson); }
注意:如果页面有多个API请求,这个方法会覆盖最新的JSON响应,你可以修改脚本把响应存成数组,记录所有的JSON请求。
方法二:自定义HTTP请求处理器(拦截所有WebBrowser发起的请求)
如果你想捕获WebBrowser发起的所有HTTP/HTTPS请求(包括非AJAX的),可以通过注册自定义的IWebRequestCreate实现来拦截请求和响应:
首先创建自定义的请求处理类:
public class CustomRequestCreator : IWebRequestCreate { public WebRequest Create(Uri uri) { // 基于默认请求创建自定义请求 var originalRequest = (HttpWebRequest)WebRequest.CreateDefault(uri); return new CustomHttpRequest(originalRequest); } } public class CustomHttpRequest : HttpWebRequest { private readonly HttpWebRequest _originalRequest; public CustomHttpRequest(HttpWebRequest originalRequest) : base(originalRequest.RequestUri) { _originalRequest = originalRequest; // 复制原始请求的关键属性 Method = originalRequest.Method; ContentType = originalRequest.ContentType; Headers = originalRequest.Headers; } public override WebResponse GetResponse() { var response = _originalRequest.GetResponse(); // 读取响应流获取原始JSON using var reader = new StreamReader(response.GetResponseStream()); string rawJson = reader.ReadToEnd(); // 这里可以处理JSON,比如打印或者保存到变量 Console.WriteLine("捕获到JSON响应:\n" + rawJson); // 重新创建响应流,因为已经读取过一次,避免后续流程无法读取 var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(rawJson)); return new CustomWebResponse(response, memoryStream); } } // 自定义响应类,返回重新创建的流 public class CustomWebResponse : HttpWebResponse { private readonly Stream _responseStream; public CustomWebResponse(HttpWebResponse originalResponse, Stream responseStream) : base(originalResponse.ResponseUri) { _responseStream = responseStream; // 复制原始响应的属性 ContentType = originalResponse.ContentType; StatusCode = originalResponse.StatusCode; } public override Stream GetResponseStream() => _responseStream; }
然后在初始化WebBrowser之前注册这个处理器:
// 注册HTTP和HTTPS前缀的自定义处理器 WebRequest.RegisterPrefix("http://", new CustomRequestCreator()); WebRequest.RegisterPrefix("https://", new CustomRequestCreator()); // 初始化WebBrowser控件 WebBrowser webBrowser1 = new WebBrowser();
注意:这个方法需要处理HTTPS证书验证的问题,如果遇到证书错误,可能需要添加代码跳过验证(仅测试环境使用,生产环境不推荐)。
方法三:用Fiddler抓包(最简单的无代码方案)
如果你不想写代码,直接用Fiddler工具就能轻松捕获所有请求:
- 启动Fiddler,它会自动设置系统代理;
- 运行你的WebBrowser程序,所有HTTP/HTTPS请求都会被Fiddler捕获;
- 在Fiddler的会话列表里找到对应的API请求,点击
Inspectors标签,切换到Response面板就能看到原始的JSON内容了。
这个方法不用修改任何代码,适合快速调试查看请求响应。
内容的提问来源于stack exchange,提问作者CathalMF
相关产品推荐
相关产品推荐

