问题描述
以50kbps的带宽上载多个文件(100Mb,200Mb,300Mb)。 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:\repo\DM\azure-storage-net-data-movement\lib\TransferScheduler.cs:line 239
at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferJobs\SingleObjectTransfer.cs:line 223
at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer,TransferContext transferContext,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferManager.cs:line 1777
at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferManager.cs:line 1777
错误:“传输失败”。
存储Blob: 12.4.4
在更快的带宽中,效果很好。
解决方法
如果发生错误,则可以设置检查点。然后从检查点再次上传。
例如:
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,resumeContext,CancellationToken.None);
task.Wait();
}
如果您认为错误不会发生一次,那么您也可以循环修改代码。
您知道根本原因是带宽不足,最好的解决方案应该对此进行改进。团队也正在考虑add bandwdith as a parameter。