写入Azure Block Blobs

Chr*_*isW 5 azure

我正在使用PutBlock和PutBlockList将数据上传到块blob,我正在使用的代码如下: -

CloudBlobContainer container = blobStorage.GetContainerReference("devicebackups");
var permissions = container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permissions);
CloudBlockBlob blob = container.GetBlockBlobReference(serialNo.ToLower() + " " + dicMonths[DateTime.Now.Month]);
try
{
    var serializer = new XmlSerializer(typeof(List<EnergyData>));
    var stringBuilder = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(stringBuilder))
    {
        try
        {
            serializer.Serialize(writer, deviceData);
            byte[] byteArray = Encoding.UTF8.GetBytes(stringBuilder.ToString());

            List<string> blockIds = new List<string>();
            try 
            { 
                blockIds.AddRange(blob.DownloadBlockList(BlockListingFilter.Committed).Select(b => b.Name)); 
            }
            catch (StorageClientException e)
            {
                if (e.ErrorCode != StorageErrorCode.BlobNotFound)
                {
                    throw;
                }
                blob.Container.CreateIfNotExist();
            }
            var newId = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockIds.Count().ToString()));
            blob.PutBlock(newId, new MemoryStream(byteArray), null);
            blockIds.Add(newId);
            blob.PutBlockList(blockIds);
        }
        catch (Exception ex) 
        { 
            UT.ExceptionReporting(ex, "Error in Updating Backup Blob - writing byte array to blob"); 
        }
    }
}
catch (Exception ex) 
{ 
    UT.ExceptionReporting(ex, "Error in Updating Backup Blob - creating XmlWriter"); 
}
}
catch (Exception ex) 
{ 
    UT.ExceptionReporting(ex, "Error in Updating Backup Blob - getting container and blob references, serial no -" + serialNo); 
}
Run Code Online (Sandbox Code Playgroud)

这适用于10个块,然后在第11个块上崩溃,出现以下错误: -

StorageClientException - 指定的阻止列表无效.

InnerException = {"The remote server returned an error: (400) Bad Request."}
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索了相同错误的报告,但没有运气.

任何帮助将非常感激.

Bri*_*chl 14

对于给定的blob,为blockid参数指定的值的长度必须与每个块的大小相同.

http://msdn.microsoft.com/en-us/library/windowsazure/dd135726.aspx

前10个块编号为0到9.第11个块是编号10,它长一个字符.因此,您应该将编号方案更改为始终使用相同的长度.一种解决方案是将计数转换为零填充字符串,该字符串足够长以容纳您期望拥有的块数.

但是如果你不需要使用块的好处,你可能最好只需要一次编写整个blob而不是使用块.