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

如何用C# RestClient分页获取SQL数据库数据避免请求崩溃

实现RestClient分页获取Access数据

要解决大数据量单次请求崩溃的问题,我们可以通过分页循环调用接口分批获取数据,直到拿到所有记录。核心思路是和后端接口约定分页参数(页码、每页条数),每次请求获取一页数据,合并结果直到没有更多数据返回。

修改后的完整代码

同步版本(贴近你原有代码风格)

public List<Access> GetAllAccess()
{
    var allAccess = new List<Access>();
    int pageIndex = 1; // 起始页码,根据后端接口约定调整(有的是从0开始)
    int pageSize = 1000; // 每页条数,可根据接口性能调整
    var client = new RestClient("http://ip+port");

    while (true)
    {
        var request = new RestRequest("GetAccess", Method.Get);
        // 添加分页参数到请求
        request.AddQueryParameter("pageIndex", pageIndex.ToString());
        request.AddQueryParameter("pageSize", pageSize.ToString());

        var response = client.Execute(request);

        if (response.StatusCode != System.Net.HttpStatusCode.OK)
        {
            // 可根据需求添加异常处理,比如抛出异常或中断循环
            break;
        }

        var currentPage = JsonConvert.DeserializeObject<List<Access>>(response.Content);
        if (currentPage == null || currentPage.Count == 0)
        {
            // 没有更多数据,退出循环
            break;
        }

        allAccess.AddRange(currentPage);

        // 如果当前页数据少于pageSize,说明是最后一页
        if (currentPage.Count < pageSize)
        {
            break;
        }

        pageIndex++;
    }

    return allAccess;
}

public class Access
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

异步版本(推荐,避免阻塞主线程)

public async Task<List<Access>> GetAllAccessAsync()
{
    var allAccess = new List<Access>();
    int pageIndex = 1;
    int pageSize = 1000;
    var client = new RestClient("http://ip+port");

    while (true)
    {
        var request = new RestRequest("GetAccess", Method.Get);
        request.AddQueryParameter("pageIndex", pageIndex.ToString());
        request.AddQueryParameter("pageSize", pageSize.ToString());

        var response = await client.ExecuteAsync(request);

        if (response.StatusCode != System.Net.HttpStatusCode.OK)
        {
            break;
        }

        var currentPage = JsonConvert.DeserializeObject<List<Access>>(response.Content);
        if (currentPage == null || currentPage.Count == 0)
        {
            break;
        }

        allAccess.AddRange(currentPage);

        if (currentPage.Count < pageSize)
        {
            break;
        }

        pageIndex++;
    }

    return allAccess;
}

关键说明

  1. 分页参数约定:确保后端接口支持接收pageIndex和pageSize参数,并返回对应页码的数据。如果后端参数名不同(比如page、limit),需要同步修改请求中的参数名。
  2. 循环终止条件:两种情况停止循环:一是接口返回空列表,二是当前页数据量小于设定的pageSize(说明已经是最后一页)。
  3. 异常处理:示例中仅简单中断循环,实际项目中可根据需求添加日志记录、重试机制或抛出自定义异常。
  4. pageSize选择:建议根据接口性能和服务器压力调整,比如1000-5000条/页,避免过大导致单次请求仍有崩溃风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:01:07