【问题标题】:Why CloudBlockBlob.StartCopyAsync sometimes writes only 0 bytes?为什么 CloudBlockBlob.StartCopyAsync 有时只写入 0 个字节?
【发布时间】:2021-01-08 12:46:37
【问题描述】:

我有一个案例,有时CloudBlockBlob.StartCopyAsync 仅将 0 字节数据写入 输入资产的 blob...应该是什么情况?所以,我决定在块 blob 长度不会增加的情况下开始复制......有什么建议吗?

private async Task CreateInputAssetBlobAsync(UploadRequest request)
{
    var cloudBlobContainer = new CloudBlobContainer(request.InputAssetStorageUri);
    var blockBlob = cloudBlobContainer.GetBlockBlobReference(request.BlobName);

    var storageCredentials = new Microsoft.Azure.Storage.Auth.StorageCredentials(_apiAccess.TempBlobAccountName, _apiAccess.TempBlobContainerKey);
    var tempBlobContainer = new CloudBlobContainer(new Uri(_apiAccess.TempBlobContainerAddress), storageCredentials);
    var tempBlockBlob = tempBlobContainer.GetBlockBlobReference(request.BlobName);

    try
    {
        await blockBlob.StartCopyAsync(tempBlockBlob);

        do
        {
            if (blockBlob.CopyState.Status == CopyStatus.Pending)
                await Task.Delay(1000);
            await blockBlob.FetchAttributesAsync();
        }
        while (blockBlob.CopyState.Status != CopyStatus.Success);

        return;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

【问题讨论】:

  • 你需要稍微修改你的代码,把文件复制方法写成一个通用函数。我的代码也是从官方抄来修改测试的,应该对你有帮助。
  • 如果我的解决方案对您有帮助,请您将我的答案标记为accepted,tks~
  • 您的问题解决了吗?有进展吗?

标签: c# asp.net-core azure-blob-storage azure-media-services


【解决方案1】:

当你想要复制 blob 内容时,你应该使用下面的代码。

更多详情,您可以download my sample in github(BlobContainerCopy)。它有效,我认为它对你有用。

您也可以参考这篇文章。希望我在这篇文章中的回答也能对你有所帮助。

Error during storage blob copy operation - The requested operation is not allowed in the current state of the entity

foreach (ICloudBlob sourceBlobRef in sourceBlobRefs)
{
    if (sourceBlobRef.Properties.ContentType != null)
    {
        // Copy the source blob
        CloudBlockBlob destBlob = destContainer.GetBlockBlobReference(sourceBlobRef.Name);

        try
        {
            //exception throwed here  - StartCopyAsync
            await destBlob.StartCopyAsync(new Uri(GetSharedAccessUri(sourceBlobRef.Name, sourceContainer)));

            ICloudBlob destBlobRef = await destContainer.GetBlobReferenceFromServerAsync(sourceBlobRef.Name);
            while (destBlobRef.CopyState.Status == CopyStatus.Pending)
            {
                Console.WriteLine($"Blob: {destBlobRef.Name}, Copied: {destBlobRef.CopyState.BytesCopied ?? 0} of  {destBlobRef.CopyState.TotalBytes ?? 0}");
                await Task.Delay(500);
                destBlobRef = await destContainer.GetBlobReferenceFromServerAsync(sourceBlobRef.Name);
            }
            Console.WriteLine($"Blob: {destBlob.Name} Complete");
        }
        catch (Exception e)
        {
            Console.WriteLine($"Blob: {destBlob.Name} Copy Failed");
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-02-19
    • 2013-02-11
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多