调用Microsoft Graph API获取共享资源报错"请求格式错误"如何解决
报错根因
- Microsoft Graph 的
/shares端点本身没有设计全局列表查询能力,该接口仅支持传入编码后的共享链接或共享资源ID,查询单个指定共享的元数据。你直接调用_graphClient.Shares.Request().GetAsync()本质是发送了无参数的GET /shares请求,该路由不存在,因此返回请求格式错误。 - 你其他drives、sites等接口调用正常,说明权限配置没有问题,和权限无关。
正确查询共享资源的方案
根据你的使用场景选择对应实现方式:
场景1:查询当前登录用户收到的所有共享资源
调用sharedWithMe接口即可,对应C#代码如下:
GraphServiceClient _graphClient = new GraphServiceClient(myAuthProvider); // 拉取当前用户被共享的所有资源 var sharedItems = await _graphClient.Me.Drive.SharedWithMe().Request().GetAsync(); // 若资源数量较多需要分页拉取全部结果,处理返回值中的 nextLink 即可 while (sharedItems.NextPageRequest != null) { var nextPage = await sharedItems.NextPageRequest.GetAsync(); sharedItems.AddRange(nextPage); }
如果是无用户登录的后台应用权限场景,指定对应用户ID即可:
var sharedItems = await _graphClient.Users["目标用户ID"].Drive.SharedWithMe().Request().GetAsync();
场景2:租户管理员查询全租户所有共享资源
Microsoft Graph没有提供单接口直接拉取全租户共享资源的能力,需要按以下步骤实现:
- 分别拉取租户内所有用户、所有SharePoint站点列表
- 遍历每个用户/站点对应的驱动器,调用搜索接口筛选共享项:
// 示例:查询指定驱动器下的所有共享项 var sharedItemsInDrive = await _graphClient.Drives["目标驱动器ID"].Root.Search("shared").Request().GetAsync();
使用该方案前需要确保应用已经配置了对应站点、用户驱动器的读取权限,且已经完成管理员同意。
内容的提问来源于stack exchange,提问作者Boris Zinchenko
相关产品推荐
相关产品推荐

