Perché CloudBlockBlob.StartCopyAsync a volte scrive solo 0 byte?

Sep 22 2020

Ho un caso che a volte CloudBlockBlob.StartCopyAsyncscrive solo 0 byte di dati nel blob dell'asset di input ... Quale dovrebbe essere il caso? Quindi, ho deciso di avviare la copia mentre la lunghezza del blob in blocco non verrà aumentata ... Qualche suggerimento?

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;
    }
}

Risposte

JasonPan Sep 24 2020 at 04:42

È necessario utilizzare il codice seguente quando si desidera copiare il contenuto del BLOB.

Per maggiori dettagli, puoi scaricare il mio esempio in GitHub (BlobContainerCopy) . Funziona e penso che ti sia utile.

Puoi anche fare riferimento a questo post. Spero che anche la mia risposta in questo post possa aiutarti.

Errore durante l'operazione di copia del BLOB di archiviazione: l'operazione richiesta non è consentita nello stato corrente dell'entità

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");
        }
    }
}