2011-02-04 6 views
6

Azure 저장소 오류 : "지정한 BLOB가 이미 있습니다",하지만 그렇지 않습니다!

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

개발 저장소에 큰 파일 (150Mb)을 업로드하면 다음 예외가 발생합니다.

Microsoft.WindowsAzure.StorageClient.StorageClientException 이 사용자에 의해 처리되지 않았습니다. code
Message = 지정된 BLOB가 이미 존재합니다.
Source = Microsoft.WindowsAzure.StorageClient

그러나 사실이 아니므로 파일이 존재하지 않습니다. 사실, 그게 왜 문제가되어야할지 모르겠다. 시도 할 때마다, 나는 문제가없는 기존 BLOB를 덮어 쓸 수있다. 가장 놀라운 점은 예외가 VS에 나타날 때 "편집 사용"을 선택하고 코드의 두 번째 줄에 실행 커서 (노란색 화살표)를 옮겨 실행하고 실행하면됩니다!

큰 파일에서만 예외가 발생하며 그 이유는 알 수 없습니다.

이것은 예외적 인 세부 사항입니다.

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: 

답변

10

이 개발 저장 알려진 문제이다

이 예외의 세부 사항이다. 블록 (블롭을 구성)을 업로드하기 위해 실행 된 여러 스레드가있을 때 이런 일이 발생합니다. 기본적으로 개발 스토리지는 SQL Server를 데이터 저장소로 사용합니다. 이제 그것이하는 일은 얼룩 정보를 저장하는 테이블에 항목을 만듭니다. 복수의 thread가 동작하고있는 경우, 이러한 모든 thread는 같은 조작을 실행하려고합니다. 최초의 thread가 성공하면 (자), 후속의 thread는이 예외를 발생시킵니다.

는 거 진짜에 발생하지 그래서
+0

덕분에, 그렇지? – vtortola

+0

사실입니다. "Commit Block List"작업을 명시 적으로 호출 할 때까지 BLOB가 커밋되지 않기 때문에 클라우드에서는 발생하지 않습니다. –