Graph SDK v5.56(.NET)批量获取Drive ID时GetResponseAsync报错求助
你当前的代码在调用GetResponsesAsync()时出错,核心原因是同步阻塞异步方法导致的上下文问题,同时代码未关联请求与站点的映射,也未处理响应数据。以下是修正后的实现方案:
问题分析
- 原方法为同步方法,但Graph SDK的批量操作API均为异步设计,直接用
GetAwaiter().GetResult()会阻塞线程,容易引发死锁或异常 - 未记录批量请求中每个requestId对应的站点ID,无法将响应结果关联到具体站点
- 未解析响应内容并提取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
相关产品推荐
相关产品推荐

