users?$expand=drive 因 InternalServerError 而失败

users?$expand=drive fails with InternalServerError

我们希望能够在集合中包含有关每个用户的个人网站 (OneDrive for Business) 的信息,以避免对 Microsoft Graph 的后续请求效率低下。

Microsoft Graph API 在通过 /users?$select=id,mail,mySite 获取用户集合时不允许查询 mySite 字段。 Graph API docs 中记录了这一事实。因此我们正在寻找替代方案,并遇到了:

GET /users?$expand=drive

GET /users?$expand=drives

因为drive对应用户的个人驱动器,有webUrl字段,与mySite.

相同

但请求导致以下错误:

{
    "error": {
        "code": "InternalServerError",
        "message": "Value cannot be null. Parameter name: source",
        "innerError": {
            "request-id": "15d69169-937a-4525-a904-e4107704d8f1",
            "date": "2017-11-08T02:11:17"
        }
    }
}

这是一个有效的记录关系。也没有任何地方记录不支持 $expand 查询参数的这种使用。虽然有一条注释 here$expand 目前仅受 beta/users 支持,但这仍然失败并出现相同的错误。

错误的潜在原因可能是用户尚未创建个人网站,因此我们尝试 drives(如上所述)假设它可能只是 return 一个空列表以及以下内容:

GET /users?$expand=drive&$filter=drive ne null

但这也是 return 一个错误,指出 Filter is not supported。虽然 $filter 不能像没有记录那样使用。只有 $expand=drive($select=webUrl;$filter=webUrl ne null) 不支持 here(如果我们理解正确的话)。

我们在office功能建议平台、Stack Overflow、微软的技术社区开发者群中搜索,均无果。

仍有发现 API 但这并不是一个真正的选择,因为我们使用的是仅应用程序令牌。此外,Microsoft Graph 是否也应该取代它,如前所述 here.

Microsoft Graph 不支持从 user 实体扩展 drive。至于为什么,我会尝试解释。

要了解此行为,需要考虑给定实体的来源。在这种情况下,user 来自 Active Directory,而 drive 来自 SharePoint。

documentation 中所述:

Note: Not all relationships and resources support the $expand query parameter. For example, you can expand the directReports, manager, and memberOf relationships on a user, but you cannot expand its events, messages, or photo relationships.

仅使用示例,请注意 directReportsmanagermemberOf 均来自 AD,而 eventsmessagesphoto 均来自 Exchange。

文档试图解释的(尽管是以一种相当混乱和迂回的方式)是 $expand 不能跨越服务边界。如果关系从一项服务跨越到另一项服务(即 Exchange 和 SharePoint),Microsoft Graph 无法在单个调用中跨越该边界导航。

部分原因是通过具有不同规则和约束的 Microsoft Graph 提供的各种服务。例如,Exchange 的限制规则与 OneNote 不同。通过 $expand 在服务之间交叉会在解决要应用哪些规则时出现问题。

希望这对您有所帮助。