如何从graph-onedrive请求新的downloadUrl?

时间:2019-02-07 17:19:39

标签: microsoft-graph microsoft-graph-sdks

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

但是,即使我在调用此方法之前显式地从服务中请求DriveItem(该方法随后使用DriveItem中AdditionalData中的downloadUrl),我仍收到响应,指示JW​​T令牌已过期。

我假设此令牌已嵌入预先认证的downloadUrl中。此外,我认为该令牌要么是一次性使用的,要么相对较快地过期了……这都是我在尝试利用该URL之前明确请求DriveItem的原因。

如何确保该服务将我发回“新” downloadUrl?是否有一些没有缓存的标头,或者我应该在DriveItem请求中明确包含的标头?

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

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

1 个答案:

答案 0 :(得分:0)

继续调试并尝试其他事情,我相信我已经找到了问题的答案...

在对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的特定到期时间(时间,使用次数等)的人,仍然是“奖励积分”。然后,我们实际上可以在本地检查我们的对象是否“过时”,并且仅在必要时重新获取。