【问题标题】:Delta Query Using the Microsoft Graph SDK 1.4 NuGet使用 Microsoft Graph SDK 1.4 NuGet 的增量查询
【发布时间】:2017-07-19 14:09:18
【问题描述】:

我正在尝试使用 .NET 客户端库(来自https://www.nuget.org/packages/Microsoft.Graph 的 1.4 版)设置增量查询示例。进行初始调用很顺利:

var page = await _graphClient.Users.Delta().Request().GetAsync();

while (page.NextPageRequest != null)
{
  page = await page.NextPageRequest.GetAsync();
}

在一段时间后获取 deltaLink 仍然很明显:

string deltaLink = (string)page.AdditionalData["@odata.deltaLink"];

但是以后使用这个 deltaLink 的正确方法是什么?我还没有找到明显的方法/构建器,可以让我稍后通过使用 URL 继续(我当前的解决方案是使用 @987654322 的“使用 .Net Microsoft Graph 客户端库发送 HTTP 请求”部分中的代码@ 并将其转换为 UserDeltaCollectionResponse - 那时我可以再次使用普通 API)。

【问题讨论】:

    标签: microsoft-graph-api


    【解决方案1】:

    我编写了一些代码来获取实际的 delta 令牌字符串。

     Uri deltaUri = new Uri(delta.AdditionalData[deltaLinkKey].ToString());
     var queries = System.Web.HttpUtility.ParseQueryString(deltaUri.Query);
     string token = queries.Get("$deltatoken");
    

    API 中有一个 QueryOption 对象,您可以将其添加到请求中。所以,你上面的代码看起来像这样。

    QueryOption deltaOption = new QueryOption("$deltaToken", deltaToken);
    var page = await _graphClient.Users.Delta().Request(new[] { deltaOption }).GetAsync();
    

    【讨论】:

    • 我认为这种方式比 Caitlin 的方式更好,因为您不必自己解析 JSON 响应并且可以使用 Microsoft.Graph 用户对象...
    【解决方案2】:

    你是对的;目前,没有一种优雅的方式可以使用 delta 链接作为新请求的基础。您需要自己保存并创建自定义 HTTP 请求:

    HttpRequestMessage hrm = new HttpRequestMessage(HttpMethod.Get, deltaLink);
    await graphClient.AuthenticationProvider.AuthenticateRequestAsync(hrm);
    HttpResponseMessage response = await graphClient.HttpProvider.SendAsync(hrm);
    

    如果您希望在同一个应用程序实例中再次使用它,您可以更轻松地使用它:

    driveItemDeltaCollectionPage.InitializeNextPageRequest(graphClient, deltaLink.ToString());
    driveItemDeltaCollectionPage = await driveItemDeltaCollectionPage.NextPageRequest.GetAsync();
    

    目前此库上有一个open issue,用于添加对增量链接的更直观支持。

    【讨论】:

    • 一个问题,当使用 deltaLink 返回数据时,对于已删除的项目,我们使用 @removed 键获得 AdditionalData;对于新项目,我们只需获取新项目;编辑/更新项目的行为如何? AdditionalData 中的任何键?还是我们只是获取整个项目(比如新项目)?
    • 顺便说一句,引用的问题现已关闭(并更新为正确答案)。看起来基于 InitializeNextPageRequest() 方法的方法不仅可以在同一个应用程序实例中使用。您应该做的就是创建一个 DriveItemDeltaCollectionPage 类的新实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多