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

Business Central Server-Driven Paging:C#中利用@odata.nextLink实现分页请求

OData分页请求改造示例(自动处理@odata.nextLink)

针对你有1万条数据、单请求超时的问题,下面是改造后的分页逻辑代码,通过do-while循环自动遍历所有@odata.nextLink,每次请求1000条数据,分10次完成全部数据拉取:

改造后完整代码

using System;
using System.IO;
using System.Net;
using System.Text;
using Newtonsoft.Json.Linq; // 需要引用Newtonsoft.Json NuGet包

// 假设CONTENTTYPE、GET_WebMethod为已定义常量,Authorization为传入的授权头字符串
public string GetAllODataData(string initialUrl)
{
    StringBuilder allResults = new StringBuilder();
    bool hasNextPage = true;
    string currentUrl = initialUrl;
    bool isFirstResponse = true;

    do
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(currentUrl);
        request.Headers.Add("Prefer", "odata.maxpagesize=1000");
        request.ContentType = CONTENTTYPE;
        request.Method = GET_WebMethod;

        if (!String.IsNullOrEmpty(Authorization))
            request.Headers.Add(HttpRequestHeader.Authorization, Authorization);

        using (var httpResponse = (HttpWebResponse)request.GetResponse())
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            string responseContent = streamReader.ReadToEnd();
            JObject responseJson = JObject.Parse(responseContent);

            // 提取当前页的数据数组
            JArray currentData = (JArray)responseJson["value"];
            
            // 拼接所有分页数据,保持JSON结构完整
            if (isFirstResponse)
            {
                allResults.Append("{\"value\": [");
                allResults.Append(currentData.ToString(Newtonsoft.Json.Formatting.None).TrimStart('[').TrimEnd(']'));
                isFirstResponse = false;
            }
            else
            {
                allResults.Append("," + currentData.ToString(Newtonsoft.Json.Formatting.None).TrimStart('[').TrimEnd(']'));
            }

            // 检查是否存在下一页链接
            JToken nextLinkToken = responseJson["@odata.nextLink"];
            hasNextPage = nextLinkToken != null && !string.IsNullOrEmpty(nextLinkToken.ToString());
            if (hasNextPage)
            {
                currentUrl = nextLinkToken.ToString();
            }
        }

    } while (hasNextPage);

    // 补全JSON结构
    allResults.Append("]}");
    return allResults.ToString();
}

关键说明

  • 循环逻辑:用do-while确保至少发起一次请求,之后每次根据响应里的@odata.nextLink判断是否继续请求下一页
  • 数据合并:通过StringBuilder拼接所有分页的value数组,最终返回结构完整的JSON结果
  • 依赖要求:需要安装Newtonsoft.Json NuGet包,用于解析JSON中的分页链接和数据数组
  • 请求一致性:每次循环重新创建HttpWebRequest,确保授权头等请求头正确传递

注意事项

  • 如果你的响应JSON结构特殊,需要调整responseJson["value"]和responseJson["@odata.nextLink"]的字段路径
  • 可根据需求添加异常处理(如请求失败重试、超时设置),避免单次请求中断整体流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:15:54