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

如何在Microsoft.Graph v5.53.0中正确传递deltaToken?

问题分析与解决

核心问题

  1. deltaToken参数名错误:代码中定义的DeltaTokenQueryKey = "%24$deltatoken"是错误的,%24是$的URL编码,这会导致实际传递的参数名为$$deltatoken,而Graph API要求的参数名是$deltatoken,SDK无法识别这个错误的参数名,导致deltaToken未生效。
  2. 请求构建方式错误:初始delta请求和后续delta请求的构建逻辑不同,后续请求应当基于返回的@odata.deltaLink或@odata.nextLink直接构建,而非重新调用Users.Delta生成新请求后手动拼接参数,这会破坏SDK内部的参数处理逻辑。

修正后的代码实现

方案一:基于传入的deltaUrl直接构建请求

public class SyncGraphServiceClient(GraphServiceClient graphServiceClient, ILogger<SyncGraphServiceClient> logger) : IGraphServiceClient
{
    private static string[] UserProperties = ["displayName", "mail"];

    private readonly GraphServiceClient _graphServiceClient = graphServiceClient;
    private readonly ILogger<SyncGraphServiceClient> _logger = logger;

    public async Task<UserCollectionResponse> PerformUsersDeltaQueryAsync(Uri deltaUrl, CancellationToken cancellationToken)
    {
        // 解析原有查询参数
        var queryParams = HttpUtility.ParseQueryString(deltaUrl.Query);

        // 确保select和top参数存在(如果原有URL中没有则添加)
        if (string.IsNullOrEmpty(queryParams.Get("$select")))
        {
            queryParams.Set("$select", string.Join(",", UserProperties));
        }
        if (string.IsNullOrEmpty(queryParams.Get("$top")))
        {
            queryParams.Set("$top", "10");
        }

        // 创建包含正确参数的请求信息
        var deltaRequest = new RequestInformation
        {
            HttpMethod = Method.GET,
            Uri = new Uri($"{deltaUrl.AbsolutePath}?{queryParams.ToString()}")
        };

        var result = await _graphServiceClient.RequestAdapter.SendAsync(
            deltaRequest, 
            UserCollectionResponse.CreateFromDiscriminatorValue, 
            cancellationToken: cancellationToken);
        return result;
    }
}

方案二:使用SDK内置的DeltaRequestBuilder

public class SyncGraphServiceClient(GraphServiceClient graphServiceClient, ILogger<SyncGraphServiceClient> logger) : IGraphServiceClient
{
    private static string[] UserProperties = ["displayName", "mail"];

    private readonly GraphServiceClient _graphServiceClient = graphServiceClient;
    private readonly ILogger<SyncGraphServiceClient> _logger = logger;

    public async Task<UserCollectionResponse> PerformUsersDeltaQueryAsync(Uri deltaUrl, CancellationToken cancellationToken)
    {
        // 基于deltaUrl创建Delta请求构建器
        var deltaRequestBuilder = new DeltaRequestBuilder(deltaUrl.ToString(), _graphServiceClient.RequestAdapter);

        var deltaRequest = deltaRequestBuilder.ToGetRequestInformation(config =>
        {
            // 配置查询参数(SDK会自动处理参数编码与合并)
            config.QueryParameters.Top = 10;
            config.QueryParameters.Select = UserProperties;
        });

        var result = await _graphServiceClient.RequestAdapter.SendAsync(
            deltaRequest, 
            UserCollectionResponse.CreateFromDiscriminatorValue, 
            cancellationToken: cancellationToken);
        return result;
    }
}

关键说明

  • 不要手动编码查询参数:Graph SDK v5会自动处理URL编码,手动编码会导致参数名错误。
  • 后续delta请求必须基于返回的deltaLink/nextLink:这些链接已经包含了有效的deltaToken和之前的查询上下文,直接复用能保证请求的正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:37:17