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 番で、1 文字長くなります。そのため、常に同じ長さを使用するように番号付けスキームを変更する必要があります。1 つの解決策は、期待されるブロック数を保持するのに十分な長さのゼロが埋め込まれた文字列にカウントを変換することです。

ただし、ブロックを使用する利点が必要ない場合は、ブロックを使用する代わりに、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.GetBytesSystem.BitConverter.GetBytes string blockIdBase64=Convert.ToBase64String(System.BitConverter.GetBytes(x++)); あるblockIDs必要があります。BitConverter.GetBytes仕事をします。
  2. 不適切なリクエスト ( Error 400) を受け取りました。temp blob「Azureストレージエクスプローラー」で削除することで解決しました。これは、以前の悪い試行からの一時ブロックをリセットするようなものです。
于 2015-11-26T07:11:18.110 に答える