2011-12-14 19 views
1

CloudBlob.BeginUploadFromStream()メソッドを使用してファイルをアップロードした後、ファイルをダウンロードするときにStorageErrorCode.ResourceNotFoundでStorageClientExceptionが発生します。 CloudBlob.UploadFromStream()メソッドを使用して同じファイルをアップロードすると、BLOBは存在し、ダウンロードできます。BeginUploadFromStreamを使用しているときにBlobが存在しません

var client = _storageAccount.CreateCloudBlobClient(); 

var container = client.GetContainerReference(BLOB_CONTAINER_DOCUMENTS_ADDRESS); 
container.CreateIfNotExist(); 

string blobName = id.ToString(); 

var newBlob = container.GetBlobReference(blobName); 
if (newBlob.Exists()) 
{ 
    var stream = newBlob.OpenRead(); 
    return stream; 
} 
else 
{ 

    throw new Exception("Blob does not exist!"); 
} 

存在は、拡張メソッドです:

は、ここに私のダウンロードコードです。私があれば、私は後で確認するときに、この例外がスローされません

var blob = container.GetBlobReference(blobName); 

アップロードするBeginUploadFromStream()メソッド

public static bool Exists(this CloudBlob blob) 
{ 
    try 
    { 
     blob.FetchAttributes(); 
     return true; 
    } 
    catch (StorageClientException e) 
    { 
     if (e.ErrorCode == StorageErrorCode.ResourceNotFound) 
     { 
      return false; 
     } 
     else 
     { 
      throw; 
     } 
    } 
} 

そして、私のコールを使用するとき、私は、エラーコードResourceNotFoundでStorageClientExceptionを取得していますブロブが存在

blob.UploadFromStream(fileStream); 

この意志

AsyncCallback uploadCompleted = new AsyncCallback(OnUploadCompleted); 
blob.BeginUploadFromStream(fileStream, uploadCompleted, documentId); 
012示唆したように

EDIT

、私はEndUploadFromStream()メソッドの呼び出しを持っていませんでした。 "Cannot close stream until all bytes are written."

誰もがいずれかを持っている"The request was aborted: The request was canceled."InnerException

blob.BeginUploadFromStream(fileStream, uploadCompleted, blob); 

そして、私のハンドラこれを実行する

private void OnUploadCompleted(IAsyncResult result) 
{ 
    var blob = (CloudBlob) result.AsyncState; 
    blob.EndUploadFromStream(result); 
} 

EndUploadFromStream()方法はMSGでWebExceptionがスローされます。ここにアップロードするために私の更新呼び出しですここで何が起こっているのか?

答えて

2

BeginUploadFromStreamはblobを非同期的にアップロードするので、blobがバックグラウンドのスレッドにアップロードされている間はメソッドが処理されます。ブロブのアップロードが完了していない場合、またはアップロードが完了したことがAzureに通知されていない場合は、ストレージにブロブが表示されません。正常に完了したトランザクションによってアップロードされたBLOBのみが表示されます。

OnUploadCompletedのコードを投稿できますか?

ブロブがまだアップロードされているかのように見えます。OnUploadCompletedメソッドでEndUploadFromStream()に電話するのを忘れてしまったかのように見えます。

+0

この提案に感謝、私は)EndUploadFromStream(への呼び出しを持っていませんでした。今私はそれを追加し、それは例外をスローしています。しかし、これはどのように呼び出すのではないのでしょうか?私はこれらのメソッドを使用する方法の例を見つけるのに苦労している。質問が更新されました – pjacko

0

IISはBeginUploadFromStreamを作成するために開始されているスレッドをキャンセルしています。ストレージAPIは実際にはボンネットの下で一連のREST呼び出しを操作しているだけなので、これらのストレージ呼び出しは従来のIOとは異なり、Webサービス呼び出しと考えることができます。

HttpKeepAlivesに関するこのトピックを確認してください。これは問題を解決するかもしれませんが、記事の内容がサイトのパフォーマンスに影響するかもしれないと指摘しています。したがって、アップロードを実行しているリクエストに対してキープアライブを有効にするだけのロジックを追加することができます。

http://www.jaxidian.org/update/2007/05/05/8/

関連する問題