2011-02-04 13 views
6

tengo este código:Error de almacenamiento de Azure: "El blob especificado ya existe", pero no es así.

 CloudBlob blob = _container.GetBlobReference(relativefilePath); 
     blob.Properties.ContentType = contentType; 
     blob.UploadFromStream(fileContent); 

Al cargar un archivo grande (150 Mb) para el almacenamiento de desarrollo y llegué esta excepción:

Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled by user code
Message=The specified blob already exists.
Source=Microsoft.WindowsAzure.StorageClient

Pero no es cierto, el archivo no se existe. En realidad, no sé por qué debería ser un problema, cada vez que lo intento, puedo sobrescribir un blob existente sin ningún problema. Lo más sorprendente es que cuando aparece la excepción en VS, selecciono "Habilitar edición", muevo el cursor de ejecución (la flecha amarilla) a la segunda línea del código que se muestra, ejecuto ... ¡y luego FUNCIONA!

Obtengo la excepción solo con archivos grandes, y no entiendo por qué.

Este es el detalle excepción:

Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled by user code 
    Message=The specified blob already exists. 
    Source=Microsoft.WindowsAzure.StorageClient 
    StackTrace: 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result() 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait() 
     at Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImpl(Func`1 impl) 
     at Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFromStream(Stream source, BlobRequestOptions options) 
     at Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFromStream(Stream source) 
     at AzureBlobOperations.AzureFileContainerOperations.PutFile(String relativefilePath, Stream fileContent, String contentType, Boolean createIfNotExists) in C:\Users\valeriano.tortola\Documents\Visual Studio 2010\Projects\TestWithBlobs\AzureBlobOperations\AzureFileOperations.cs:line 61 
     at TestWithBlobs.Web.Controllers.HomeController.PostFile(HttpPostedFileBase fileUpload) in C:\Users\valeriano.tortola\Documents\Visual Studio 2010\Projects\TestWithBlobs\TestWithBlobs.Web\Controllers\HomeController.cs:line 31 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: System.Net.WebException 
     Message=The remote server returned an error: (409) Conflict. 
     Source=System 
     StackTrace: 
      at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
      at Microsoft.WindowsAzure.StorageClient.EventHelper.ProcessWebResponse(WebRequest req, IAsyncResult asyncResult, EventHandler`1 handler, Object sender) 
     InnerException: 

Respuesta

10

Este es un problema conocido con el almacenamiento de desarrollo. Esto sucede cuando hay varios hilos lanzados para cargar los bloques (que constituyen el blob). Básicamente lo que está sucediendo es que el almacenamiento de desarrollo hace uso de SQL Server como el almacén de datos. Ahora lo primero que hace es hacer una entrada en la tabla que almacena información blob. Si hay varios hilos trabajando, todos estos hilos intentarán realizar la misma operación. Después de que el primer subproceso tiene éxito, los subprocesos posteriores generarán esta excepción.

+0

gracias, por lo que no va a suceder en la realidad, no es así? – vtortola

+0

Eso es verdad. No sucederá en la nube porque un blob no se compromete hasta el momento en que invoque explícitamente la operación "Commit Block List". –

Cuestiones relacionadas