【问题标题】:Azure storage error: "The specified blob already exists", but it doesn't!Azure 存储错误:“指定的 blob 已存在”,但它不存在!
【发布时间】:2011-06-21 08:02:00
【问题描述】:

我有这个代码:

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

当我将一个大文件 (150Mb) 上传到开发存储时,我得到了这个异常:

Microsoft.WindowsAzure.StorageClient.StorageClientException 未被用户代码处理
Message=指定的 blob 已存在。
Source=Microsoft.WindowsAzure.StorageClient

但事实并非如此,该文件不存在。实际上,我不知道为什么这应该是一个问题,每次我尝试过时,我都可以覆盖现有的 blob 而不会出现任何问题。最神奇的是,当VS出现异常时,我选择“启用编辑”,我将执行光标(黄色箭头)移动到显示的第2行代码,执行......然后IT WORKS!

只有大文件才会出现异常,我不明白为什么。

这是异常详情:

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: 

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

    这是开发存储的一个已知问题。当启动多个线程来上传块(构成 blob)时,就会发生这种情况。基本上正在发生的事情是开发存储使用 SQL Server 作为数据存储。现在它要做的第一件事就是在存储 blob 信息的表中创建一个条目。如果有多个线程在工作,那么所有这些线程都将尝试执行相同的操作。第一个线程成功后,后面的线程都会引发这个异常。

    【讨论】:

    • 谢谢,所以它不会在现实中发生,不是吗?
    • 确实如此。它不会在云中发生,因为直到您显式调用“提交阻止列表”操作时才会提交 blob。
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2019-04-03
    • 2017-12-14
    • 2021-04-16
    • 2020-03-26
    • 1970-01-01
    • 2021-07-09
    • 2017-04-17
    相关资源
    最近更新 更多