Как реализовать возобновляемую загрузку с помощью Microsoft.Graph.GraphServiceClient из C#

Кто-нибудь знает, как использовать C# OneDrive SDK для выполнения возобновляемой загрузки?

Когда я использую IDriveItemRequestBuilder.CreateUploadSession, я всегда получаю новый сеанс со сбросом NextExpectedRanges. Если я использую .UploadURL и вручную отправляю HTTP-сообщение, я получаю правильный, следующий диапазон назад, однако я не знаю, как возобновить сеанс загрузки с помощью sdk. Кажется, нет средства от API до «OpenUploadSession», или, по крайней мере, я могу найти. Я также не могу найти рабочий пример. Я подозреваю, что это должно быть обычным вариантом использования.

Обратите внимание, ключевые слова в тексте - возобновляемые.


person nearproc    schedule 17.06.2019    source источник
comment
К вашему сведению, не идеально, но кэширование UploadSessions (объединение последних NextExpectedRanges), похоже, работает, но это далеко не идея и не поможет возобновить работу после перезапуска процесса.   -  person nearproc    schedule 17.06.2019
comment
Как это может быть дубликатом? Ссылка, которую вы разместили, показывает, как использовать API для загрузки всех в рамках одного сеанса. Как ясно указано в заголовке, я пытаюсь возобновить загрузку. Это означает либо повторное построение сеанса загрузки из параметров (что кажется невозможным, учитывая отсутствие «открытого API сеанса загрузки», либо кэширование сеанса загрузки на какой-либо карте. Последнее работает, но не идеально; если процесс умирает, тогда то же самое и с картой.Поэтому, если загрузка прерывается из-за завершения процесса, весь файл должен быть загружен повторно.   -  person nearproc    schedule 27.06.2019
comment
Мои извинения - внутренне мы называем загрузку на основе сеанса возобновляемой загрузкой, и я иначе прочитал ваш вопрос. Я вижу, о чем вы просите сейчас.   -  person Brad    schedule 27.06.2019


Ответы (1)


Способ возобновления зависит от того, сколько у вас состояния. Минимум отпущения грехов, который требуется, равен UploadSession.UploadUrl (думайте об этом как об уникальном идентификаторе сеанса). Если у вас нет этого URL-адреса, вам нужно создать новый сеанс загрузки и начать с самого начала, в противном случае, если он у вас есть, вы можете сделать что-то вроде следующего, чтобы возобновить:

var uploadSession = new UploadSession
{
    NextExpectedRanges = Enumerable.Empty<string>(),
    UploadUrl = persistedUploadUrl,
};

var maxChunkSize = 320 * 1024; // 320 KB - Change this to your chunk size. 5MB is the default.
var provider = new ChunkedUploadProvider(uploadSession, graphClient, ms, maxChunkSize);

// This will query the service and make sure the remaining ranges are accurate.
uploadSession = await provider.UpdateSessionStatusAsync();

// Since the remaining ranges is now accurate, this will return the requests required to
// complete the upload.
var chunkRequests = provider.GetUploadChunkRequests();

...

Если у вас больше состояний, вы сможете пропустить некоторые из вышеперечисленных. Например, если у вас уже есть ChunkedUploadProvider, но вы не знаете, является ли он точным (возможно, он был сериализован на диск или что-то в этом роде), вы можете просто начать процесс с вызова UpdateSessionStatusAsync.

К вашему сведению, вы можете увидеть код для ChunkedUploadProvider здесь на случай, если это будет полезно, чтобы увидеть, что происходит под одеялом.

person Brad    schedule 27.06.2019