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

如何在C#中使用Selenium发起无缓存的API请求?

解决Selenium发起API请求时的缓存问题

由于依赖双因素认证登录,你选择用Selenium导航API URL获取数据,但浏览器缓存导致无法同步最新数据,以下是几种可行的无缓存请求方案:

方案1:配置浏览器禁用缓存

直接在FirefoxOptions中设置禁用缓存的偏好,让浏览器默认不缓存请求:

var options = new FirefoxOptions();
// 禁用浏览器各类型缓存
options.SetPreference("browser.cache.disk.enable", false);
options.SetPreference("browser.cache.memory.enable", false);
options.SetPreference("browser.cache.offline.enable", false);
options.SetPreference("network.http.use-cache", false);

var driver = new FirefoxDriver(options);
string url = "https://www.example.com";

Login(driver, url + "/login"); // 完成双因素认证登录

string getId = "1001";
string apiPath = url + "/api/get/" + getId;
while (true)
{
    driver.Navigate().GoToUrl(apiPath);
    DecodeData(driver.PageSource); // 解析响应数据
    Thread.Sleep(1000);
}

方案2:给API URL添加随机参数

每次请求时在URL末尾追加随机生成的查询参数(如时间戳、随机数),让浏览器认为是全新请求,绕过缓存:

var options = new FirefoxOptions();
var driver = new FirefoxDriver(options);
string url = "https://www.example.com";

Login(driver, url + "/login");

string getId = "1001";
string apiBasePath = url + "/api/get/" + getId;
while (true)
{
    // 添加UTC时间戳作为随机参数
    string apiPath = $"{apiBasePath}?t={DateTime.UtcNow.Ticks}";
    driver.Navigate().GoToUrl(apiPath);
    DecodeData(driver.PageSource);
    Thread.Sleep(1000);
}

方案3:用DevTools直接发送带缓存控制的请求(推荐)

利用Selenium的DevTools API直接发送HTTP请求,设置Cache-Control: no-cache头,无需导航到URL,更高效且能精准控制缓存:

var options = new FirefoxOptions();
var driver = new FirefoxDriver(options);
string url = "https://www.example.com";

Login(driver, url + "/login");

// 初始化DevTools会话
var devTools = driver.CreateDevToolsSession();
await devTools.Network.EnableAsync();

string getId = "1001";
string apiPath = url + "/api/get/" + getId;
while (true)
{
    // 构造带缓存控制头的请求
    var request = new Network.RequestWillBeSentPayload
    {
        Url = apiPath,
        Headers = new Dictionary<string, string>
        {
            {"Cache-Control", "no-cache"}
        }
    };

    // 发送请求并获取响应体
    var response = await devTools.Network.GetResponseBodyAsync(new Network.GetResponseBodyCommandSettings
    {
        RequestId = request.RequestId
    });
    DecodeData(response.Body);
    Thread.Sleep(1000);
}

注意:方案3需要确保你的Selenium版本支持DevTools API,且Firefox浏览器与驱动版本匹配。

内容的提问来源于stack exchange,提问作者Sharpeye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:29:58