#c# #azure #azure-blob-storage #blobstorage
#c# #azure #azure-blob-хранилище #blobstorage
Вопрос:
Загрузка нескольких файлов (100 МБ, 200 МБ, 300 МБ) с пропускной способностью 50 Кбит / с. Ошибка была выдана через 30 минут после сбоя всех файлов.
Код:
TransferManager.Configurations.BlockSize = 4 * 1024 * 1024; //4MB
CloudBlockBlob blockBlob = new CloudBlockBlob(new Uri(destSasUrl));
ServicePointManager.Expect100Continue = false;
SingleTransferContext context = new SingleTransferContext();
context.SetAttributesCallbackAsync = async (src, dest) =>
{
CloudBlob destBlob = dest as CloudBlob;
destBlob.Properties.ContentType = MimeMapping.MimeUtility.GetMimeMapping(Path.GetFileName(sourcePath));
};
TransferManager.Configurations.ParallelOperations = 2;
// Start the upload
Task task = TransferManager.UploadAsync(sourcePath, blockBlob, null, context);
await task;
Исключение:
at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
Ошибка: «Передача не удалась».
Большой двоичный объект хранилища: 12.4.4
При более высокой пропускной способности это работает хорошо.
Комментарии:
1. Вы можете попытаться сохранить
checkpoint
сообщение об ошибке when, а затем повторить попытку загрузки с контрольной точки. Взгляните на этот пример .2. @IvanYang Как вы хотите, чтобы я написал это после возникновения исключения? можете ли вы опубликовать это как ответ??
3. да, запишите это после исключения. Я опубликую это позже.
Ответ №1:
Вы можете установить контрольную точку в случае возникновения ошибки. Затем повторите загрузку с контрольной точки.
Например:
TransferCheckpoint checkpoint = null;
SingleTransferContext context = new SingleTransferContext();
try
{
// Upload a local blob
var task = TransferManager.UploadAsync(
sourcePath, destBlob, null, context, CancellationToken.None);
task.Wait();
}
catch
{
// Store the transfer checkpoint
checkpoint = context.LastCheckpoint;
// Create a new TransferContext with the store checkpoint
SingleTransferContext resumeContext = new SingleTransferContext(checkpoint);
// Upload from the checkpoint
var task = TransferManager.UploadAsync(
sourcePath, destBlob, null, resumeContext, CancellationToken.None);
task.Wait();
}
Вы также можете изменить код в цикле, если считаете, что ошибка возникает не только один раз.
И вы знаете, что основная причина связана с низкой пропускной способностью, лучшее решение должно улучшить ее. Команда также рассматривает возможность добавления bandwdith в качестве параметра.
Комментарии:
1. Кажется, я получаю исключение внутри части исключения.