6

私はこのコードを持っています:

        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が機能します!!

大きなファイルでのみ例外が発生しますが、その理由がわかりません。

これは例外の詳細です:

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: 
4

1 に答える 1

11

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

于 2011-02-04T12:20:22.020 に答える