как запросить новый URL-адрес загрузки из graph-onedrive?

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

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

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

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

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

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


person AWeber    schedule 07.02.2019    source источник
comment
Включаете ли вы заголовок Authorization при попытке загрузить файл?   -  person Marc LaFleur    schedule 08.02.2019
comment
Нет, сэр. Согласно этой странице, документы .microsoft.com/en-us/graph/api/ Я не должен этого делать.   -  person AWeber    schedule 08.02.2019


Ответы (1)


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

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

person AWeber    schedule 08.02.2019