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

Graph SDK v5.56(.NET)批量获取Drive ID时GetResponseAsync报错求助

使用Graph SDK v5.56 (.NET)批量获取SharePoint站点Drive ID的问题

你当前的代码在调用GetResponsesAsync()时出错,核心原因是同步阻塞异步方法导致的上下文问题,同时代码未关联请求与站点的映射,也未处理响应数据。以下是修正后的实现方案:

问题分析

  1. 原方法为同步方法,但Graph SDK的批量操作API均为异步设计,直接用GetAwaiter().GetResult()会阻塞线程,容易引发死锁或异常
  2. 未记录批量请求中每个requestId对应的站点ID,无法将响应结果关联到具体站点
  3. 未解析响应内容并提取Drive ID,最终返回的集合为空

修正后的代码

using Microsoft.Graph;
using Microsoft.Graph.Batch;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

private async Task<List<(string SiteId, string DriveId)>> GetSharepointDriveIdsAsync(GraphServiceClient gsc, List<Site> siteList)
{
    var siteDriveIds = new List<(string SiteId, string DriveId)>();
    int batchSize = 20; // Graph API批量请求最大支持20个步骤

    for (int i = 0; i < siteList.Count; i += batchSize)
    {
        var batchRequestContent = new BatchRequestContentCollection(gsc);
        var batchSites = siteList.Skip(i).Take(batchSize).ToList();
        var requestIdToSiteId = new Dictionary<string, string>();

        // 构建批量请求步骤并记录映射关系
        foreach (var site in batchSites)
        {
            var requestInfo = gsc.Sites[site.Id].Drives.ToGetRequestInformation();
            var requestId = await batchRequestContent.AddBatchRequestStepAsync(requestInfo);
            requestIdToSiteId[requestId] = site.Id;
        }
        
        // 发送批量请求并获取响应
        var batchResponse = await gsc.Batch.PostAsync(batchRequestContent);
        var responses = await batchResponse.GetResponsesAsync();

        // 处理每个响应结果
        foreach (var (requestId, responseMessage) in responses)
        {
            if (responseMessage.IsSuccessStatusCode)
            {
                var siteId = requestIdToSiteId[requestId];
                var drives = await responseMessage.Content.ReadFromJsonAsync<DriveCollectionResponse>();
                
                if (drives?.Value != null)
                {
                    // 将站点下所有Drive ID加入结果集合
                    siteDriveIds.AddRange(
                        drives.Value.Select(drive => (siteId, drive.Id))
                    );
                }
            }
            else
            {
                // 可添加错误处理逻辑,比如日志记录
                var errorDetails = await responseMessage.Content.ReadAsStringAsync();
                // 示例:Console.WriteLine($"请求{requestId}失败: {errorDetails}");
            }
        }
    }

    return siteDriveIds;
}

关键修改说明

  • 异步化改造:将方法改为异步签名,所有异步API调用使用await,避免同步阻塞引发的异常
  • 请求-站点映射:通过字典记录每个批量请求ID对应的站点ID,确保响应结果能正确关联到站点
  • 响应解析:使用ReadFromJsonAsync<DriveCollectionResponse>解析响应内容,提取站点下的所有Drive资源
  • 错误处理:增加了基础的错误响应处理,可根据业务需求扩展为日志记录、重试机制等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:00:09