Ошибка хранилища Azure: «Указанный большой двоичный объект уже существует», но это не так! - PullRequest
6 голосов
/ 04 февраля 2011

У меня есть этот код:

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

Когда я загружаю большой файл (150 МБ) в хранилище разработки и получаю следующее исключение:

Microsoft.WindowsAzure.StorageClient.StorageClientException не был обработан кодом пользователя
Сообщение = Указанный большой двоичный объект уже существует.
Source = Microsoft.WindowsAzure.StorageClient

Но это не так, файл не существует.На самом деле, я не знаю, почему это должно быть проблемой, каждый раз, когда я пытался, я могу перезаписать существующий блоб без любой проблемы.Самое удивительное, что когда в VS появляется исключение, я выбираю «Включить редактирование», я перемещаю курсор выполнения (желтая стрелка) на 2-ю строчку кода, которая была показана, выполняется ... и затем ЭТО РАБОТАЕТ !!

Я получаю исключение только с большими файлами, и я не понимаю, почему.

Это деталь исключения:

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: 

1 Ответ

10 голосов
/ 04 февраля 2011

Это известная проблема с хранилищем разработки. Это происходит, когда для загрузки блоков запущено несколько потоков (которые составляют большой двоичный объект). В основном происходит то, что хранилище для разработки использует SQL Server в качестве хранилища данных. Теперь первое, что он делает, это делает запись в таблицу, в которой хранится информация BLOB-объектов. Если работает несколько потоков, то все эти потоки будут пытаться выполнить одну и ту же операцию. После успешного завершения первого потока последующие потоки приведут к возникновению этого исключения.

...