Microsoft graph api 如何从graph onedrive请求新的下载URL?

Microsoft graph api 如何从graph onedrive请求新的下载URL?,microsoft-graph-api,microsoft-graph-sdks,Microsoft Graph Api,Microsoft Graph Sdks,在我使用Graph SDK编写的C#代码中,我正在使用这里慷慨提供的方法测试“下载大文件”: 然而,即使我在调用此方法之前明确地从服务请求DriveItem(该方法随后使用DriveItem中的AdditionalData中的downloadUrl),我也会收到一个指示JWT令牌已过期的响应 我假设这个令牌嵌入了预验证的下载URL中。此外,我从理论上推断,这个令牌要么一次性使用,要么相对较快地过期……这两个原因都使我在尝试使用该URL之前明确请求DriveItem 我如何确保该服务正在向我发回一

在我使用Graph SDK编写的C#代码中,我正在使用这里慷慨提供的方法测试“下载大文件”:

然而,即使我在调用此方法之前明确地从服务请求DriveItem(该方法随后使用DriveItem中的AdditionalData中的downloadUrl),我也会收到一个指示JWT令牌已过期的响应

我假设这个令牌嵌入了预验证的下载URL中。此外,我从理论上推断,这个令牌要么一次性使用,要么相对较快地过期……这两个原因都使我在尝试使用该URL之前明确请求DriveItem

我如何确保该服务正在向我发回一个“新的”下载URL?是否存在一些无缓存头或我应该在DriveItem请求中显式包含的内容

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


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

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

在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只在有限的时间内有效。。。
IList opts=新列表();
选择添加(新标题选项(“缓存控制”、“无缓存、无存储”);
选择添加(新标题选项(“如果不匹配”,“xyz”)//从不匹配
DriveItem item=wait client.Me.Drive.Items[Id].Request(opts.GetAsync();
如果(项==null)
{
log.Warn(“无法获取现有的driveItem?”+Id);
返回null;
}
对象下载URL=null;
item.AdditionalData?.TryGetValue(@“@microsoft.graph.downloadUrl”,out downloadUrl);
我仍在测试,但初步测试表明它是有效的。当我的测试有合理的结论性时,我会更新这个答案


对于能够识别这些URL的特定过期时间(时间、使用次数等)的任何人来说,仍然是“加分”。然后我们可以在本地检查我们的对象是否“过时”,并且只有在必要时才能重新获取。

您在尝试下载文件时是否包含
授权
标题?不,先生。根据这一页,我不应该这样做。