2012-04-23 16 views
5

estoy usando PutBlock y PutBlockList cargar datos en una burbuja de bloque, el código que estoy utilizando para esto es a continuación: -escritura a Azure Bloque Blobs

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

Esto funciona para 10 bloques, a continuación, en el 11 bloquearlo se bloquea con el siguiente error: -

StorageClientException - La lista de bloqueo especificada no es válida.

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

He buscado en Internet informes del mismo error, pero no he tenido suerte.

Cualquier ayuda sería muy apreciada.

+1

Por curiosidad, ¿alguna razón por la que simplemente está usando una corriente para enrollarla en la burbuja? – BrentDaCodeMonkey

+0

¿Está utilizando este código en el emulador o en una cuenta de almacenamiento real? –

+0

te falta un 'try {' al principio, porque tienes un '} catch' después de todo el código entre paréntesis –

Respuesta

14

For a given blob, the length of the value specified for the blockid parameter must be the same size for each block.

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

Los primeros 10 bloques están numeradas del 0 al 9. El bloque 11 es el número 10, que es más largo por un carácter. Por lo tanto, debe cambiar su esquema de numeración para usar siempre la misma longitud. Una solución sería convertir el recuento a una cadena sin relleno que sea lo suficientemente larga como para contener la cantidad de bloques que espera tener.

Pero si no necesita los beneficios del uso de bloques, es mejor que simplemente escriba todo el blob de una vez en lugar de usar bloques.

+0

Gracias por la respuesta breischl, estaba usando la longitud de cadena convertida para comparar los identificadores de bloque. Necesito funcionalidad de bloqueo ya que no tengo todos los datos al mismo tiempo. Lo implementaré hoy y te haré saber cómo funciona. Gracias de nuevo. – ChrisW

+0

¡Eso funcionó como un regalo, gracias! – ChrisW

2

Fije su BlockID tiene debajo de código

var blockIdBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId.ToString(CultureInfo.InvariantCulture).PadLeft(32, '0'))); 
0

Mi problema era que después de 10 bloques puesto que he recibido la solicitud incorrecta (Error 400).

  1. Sustituido Encoding.UTF8.GetBytes con System.BitConverter.GetBytesstring blockIdBase64=Convert.ToBase64String(System.BitConverter.GetBytes(x++)); El blockIDs deben ser del mismo tamaño. BitConverter.GetBytes funciona el .
  2. Todavía recibí la mala solicitud (Error 400). Lo solucioné por borrando el temp blob con 'Azure storage explorer'. Es como restablecer el bloque temporal de mis intentos fallidos anteriores.
Cuestiones relacionadas