使用MS Graph SDK V4.54.0获取指定用户关注的SharePoint站点的高效方案咨询
你猜的完全没错!Users[userEmailAddress].FollowedSites这个SDK调用对应的Graph API端点其实并不存在——目前微软只开放了/me/followedSites用于获取当前用户关注的SharePoint站点,直接调用其他用户的这个路径自然会抛出你看到的通用处理异常。
你自己写的遍历所有站点+检查用户信息列表的方法确实效率极低,完全不适合生产环境,下面给你两个高效的替代方案:
方案一:通过用户Profile的关注列表筛选站点
这个方法直接调用Graph API获取用户所有关注的对象,再筛选出类型为站点的内容,性能和准确性都有保障:
代码示例
var graphClient = GetMSGraphClient_WithClientSecret(); string targetUserUPN = "目标用户邮箱@域名.com"; // 替换为实际用户的UPN或邮箱 // 获取用户关注的所有对象,并筛选站点类型 var followingItems = await graphClient.Users[targetUserUPN] .Profile .Following .Request() .Filter("entityType eq 'site'") // 只保留站点类型的关注项 .GetAsync(); // 将关注项映射为Site对象(按需提取属性) var followedSites = followingItems.Select(item => new Site { Id = item.Id, WebUrl = item.WebUrl, DisplayName = item.DisplayName }).ToList(); Assert.IsTrue(followedSites.Count > 0);
权限要求
需要配置以下应用权限(或委托权限,根据你的认证方式选择):
User.Read.All(获取用户Profile信息)Sites.Read.All(读取站点基本信息)
方案二:使用Graph搜索API筛选用户关注的站点
如果方案一无法满足你的需求(比如需要更多站点属性),可以用Graph的站点搜索功能,直接搜索被目标用户关注的站点:
代码示例
var graphClient = GetMSGraphClient_WithClientSecret(); string targetUserUPN = "目标用户邮箱@域名.com"; var followedSites = new List<Site>(); var searchRequest = graphClient.Sites .Search($"followedBy:{targetUserUPN}") // 搜索条件:被指定用户关注的站点 .Request(); // 处理分页结果(避免只获取第一页) do { var resultPage = await searchRequest.GetAsync(); followedSites.AddRange(resultPage); searchRequest = resultPage.NextPageRequest; } while (searchRequest != null); Assert.IsTrue(followedSites.Count > 0);
权限要求
需要配置Sites.Read.All应用权限(或委托权限)。
额外说明
- 如果你只是测试环境使用,可以尝试Graph Beta版本的
/beta/users/{user-id}/followedSites端点,但Beta版本的API不稳定,官方不建议用于生产环境。 - 绝对不要继续使用你原来的遍历方案,它的时间复杂度是O(n*m),随着站点数量增加会完全不可用。
备注:内容来源于stack exchange,提问作者TechyGypo
相关产品推荐
相关产品推荐

