You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:24:10