2011-02-04 15 views
6

ho questo codice:Errore di archiviazione di Azure: "Il blob specificato esiste già", ma non lo è!

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

Quando carico un file di grandi dimensioni (150Mb) per la memorizzazione di sviluppo e ho ottenuto questa eccezione:

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

ma non è vero, il file non esistere. In realtà, non so perché questo dovrebbe essere un problema, ogni volta che ho provato, posso sovrascrivere un blob esistente senza alcun problema. Il più sorprendente è che quando compare l'eccezione in VS, seleziono "Abilita modifica", sposto il cursore di esecuzione (la freccia gialla) alla seconda riga di codice mostrata, eseguita ... e poi FUNZIONA !!

Ricevo l'eccezione solo con file di grandi dimensioni e non capisco perché.

Questo è il particolare eccezione:

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: 

risposta

10

Questo è un problema noto con immagazzinaggio sviluppo. Questo succede quando ci sono più thread lanciati per caricare i blocchi (che costituiscono il blob). In sostanza, ciò che accade è che lo storage di sviluppo utilizza SQL Server come archivio dati. Ora la prima cosa che fa è inserire una voce nella tabella che memorizza le informazioni del BLOB. Se sono presenti più thread, tutti questi thread proveranno a eseguire la stessa operazione. Dopo che il primo thread ha avuto esito positivo, i thread successivi genereranno questa eccezione.

+0

grazie, quindi non succederà nella cosa reale, non è vero? – vtortola

+0

È vero. Non si verificherà nel cloud perché un blob non viene eseguito fino al momento in cui si invoca esplicitamente l'operazione "Elenco blocchi di commit". –

Problemi correlati