как вы запрашиваете новый downloadUrl от graph-onedrive? - PullRequest
0 голосов
/ 07 февраля 2019

В моем коде C # с Graph SDK я тестирую «скачать большой файл» с помощью метода, который здесь щедро предоставлен: Загрузка больших файлов из OneDrive с использованием Microsoft Graph SDK

Однакодаже если я явно запрашиваю DriveItem у службы непосредственно перед вызовом этого метода (который затем использует downloadUrl из AdditionalData в DriveItem), я получаю ответ, указывающий, что JWT Token Expired.

Я предполагаю, что этот токенвстроен в предварительно аутентифицированный downloadUrl.Кроме того, я теоретизирую, что этот токен либо одноразовый, либо срок его действия истекает довольно быстро ... для меня есть две причины явно запросить DriveItem непосредственно перед попыткой использовать этот URL.

Как я могу гарантировать, что службаотправляет мне обратно "свежий" downloadUrl?Есть ли какие-либо заголовки без кэширования или что-то, что я должен явно включить в свой запрос DriveItem?

Как уже упоминалось, даже если у меня есть объект DriveItem локальный, я явно повторно выбираю его из службы, чтобы убедиться, что у меня естьпоследние свойства и новый downloadUrl.(Но это не работает.) Использование объекта Request без каких-либо дополнительных заголовков (или других параметров odata) явно недостаточно для запуска генерации нового URL.

Это не происходит при каждом тесте.Я полагаю, что это происходит при повторном запуске теста с тем же DriveItem в короткий промежуток времени.Опять же, я не уверен, является ли токен JWT одноразовым или истекшим во времени, но если он в любом случае истек, я думаю, что сервис должен автоматически сгенерировать новый.Если это не практично, то понимание того, как явно запрашивать новый, безусловно, эффективно!

1 Ответ

0 голосов
/ 08 февраля 2019

Продолжая отлаживать и пробовать разные вещи, я думаю, что нашел ответ на свой вопрос ...

Отправка заведомо ложного ETag в запросе на DriveItem, кажется, заставляет сервис отправлять меняновая копия.Пример кода следующий:

//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 (время, количество использований и т. Д.).Затем мы можем на самом деле проверить локально, является ли наш объект "устаревшим", и повторно выбирать его только при необходимости.

...