0

在我使用 Graph SDK 的 C# 代码中,我正在使用此处慷慨提供的方法测试“下载大文件”:使用 Microsoft Graph SDK 从 OneDrive 下载大文件

但是,即使我在调用此方法之前从服务中明确请求 DriveItem(然后使用 DriveItem 中 AdditionalData 中的 downloadUrl),我收到的响应表明 JWT 令牌已过期。

我假设这个令牌嵌入在预认证的 downloadUrl 中。此外,我推测这个令牌要么是一次性的,要么它会相对较快地过期......这两个原因都是我在尝试使用该 URL 之前明确请求 DriveItem 的原因。

如何确保该服务向我发回“新鲜”的 downloadUrl?是否有一些无缓存标头或我应该在 DriveItem 请求中明确包含的内容?

如前所述,即使我在本地有 DriveItem 对象,我也会明确地从服务中重新获取它,以确保我拥有最新的属性和新的 downloadUrl。(但这不起作用。)使用没有任何额外标头(或其他 odata 参数)的 Request 对象显然不足以触发新 URL 的生成。

并非每次测试都会发生这种情况。我相信在短时间内使用相同的 DriveItem 重新运行测试时会发生这种情况。同样,我不确定 JWT 令牌是一次性使用的还是过期的,但如果它在任何情况下都过期了,我认为该服务应该自动生成一个新令牌。如果这不切实际,那么仅仅了解如何明确要求一个新的当然也很有效!

4

1 回答 1

1

继续调试和尝试不同的东西,我相信我已经找到了我的问题的答案......

在 DriveItem 请求中发送已知错误的 ETag 似乎会强制服务向我发送新副本。示例代码如下:

//we need a "recent" copy of this object, because the downloadURL is only good for a limited time...
IList<HeaderOption> opts = new List<HeaderOption>();
opts.Add(new HeaderOption("Cache-Control", "no-cache, no-store"));
opts.Add(new HeaderOption("if-none-match", "xyz")); //never match

DriveItem item = await client.Me.Drive.Items[Id].Request(opts).GetAsync();
if (item == null)
{
    log.Warn("Could not fetch existing driveItem? " + Id);
    return null;
}

object downloadUrl = null;
item.AdditionalData?.TryGetValue(@"@microsoft.graph.downloadUrl", out downloadUrl);

我仍在对此进行测试,但初步测试表明它可以工作。当我的测试具有合理结论时,我将更新此答案。

对于能够识别这些 URL 的具体到期时间(时间、使用次数等)的任何人来说,仍然是“奖励积分”。然后我们实际上可以在本地检查我们的对象是否“陈旧”,并且仅在必要时重新获取。

于 2019-02-08T15:56:04.397 回答