2011-02-04 33 views
6

私はこのコードを持っている:私は開発のストレージに大きなファイル(150MB)をアップロードし、私はこの例外に着いたときAzureストレージエラー:「指定されたBLOBはすでに存在しますが、そうではありません!

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

Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled by user code
Message=The specified blob already exists.
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: 

答えて

10

これは、開発ストレージの既知の問題です。これは、ブロック(BLOBを構成する)をアップロードするために起動された複数のスレッドがある場合に発生します。基本的に何が起こっているのかは、開発ストレージがSQL Serverをデータストアとして使用することです。今はまず、ブロブ情報を格納するテーブルにエントリを作成します。複数のスレッドが動作している場合、これらのスレッドはすべて同じ操作を実行しようとします。最初のスレッドが成功すると、後続のスレッドによってこの例外が発生します。

+0

おかげで、それはつもり本物で発生していない、それはないですか? – vtortola

+0

それは本当です。 「Commit Block List」操作を明示的に呼び出すまで、BLOBはコミットされないので、クラウドでは発生しません。 –

関連する問題