5

我正在使用 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); 
}

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

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

InnerException = {"The remote server returned an error: (400) Bad Request."}

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

任何帮助将非常感激。

4

3 回答 3

14

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

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

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

但是,如果您不需要使用块的好处,那么您最好一次性编写整个 blob 而不是使用块。

于 2012-04-23T21:40:06.093 回答
2

设置您的 BlockID 具有以下代码

var blockIdBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId.ToString(CultureInfo.InvariantCulture).PadLeft(32, '0')));
于 2012-09-27T06:34:38.513 回答
0

我的问题是,在 10 个 put 块之后,我收到了错误的请求Error 400)。

  1. 替换Encoding.UTF8.GetBytes为 必须大小相同System.BitConverter.GetBytes string blockIdBase64=Convert.ToBase64String(System.BitConverter.GetBytes(x++)); 。做这项工作。blockIDsBitConverter.GetBytes
  2. 我仍然收到了错误的请求(Error 400)。我通过删除temp blob“Azure 存储资源管理器”解决了这个问题。这就像从我以前的错误尝试中重置临时块一样。
于 2015-11-26T07:11:18.110 回答