2012-04-03 5 views
13

Azure blob(最終更新日時)の情報を取得しようとしています。この情報は、CloudBlob.Properties.LastModifiedUtcプロパティに格納されます。Azure Storage CloudBlob.Propertiesは、GetBlobReference()を使用して初期化されていません。

メソッドGetBlobReference()またはGetBlockBlobReference()を使用すると、BLOBのプロパティは初期化されません(LastModifiedUtcはDateTime.MinDate)。 ListBlobs()を使用すると、プロパティが正しく初期化されます(LastModifiedUtcは正しい値を持ちます)。

GetBlobReference関数を使用するときに何か問題がありますか?ある特定のBLOBのCloudBlobインスタンスを取得する方法はありますか?私はListBlobs()を逃して、私が興味を持っているBLOBだけをフィルターに掛けたり、CloudBlobClientクラスのListBlobsWithPrefix()を使うことができますが、特定のBLOB参照を求めるときはすべてのメタデータを取得すると思います。

私はAzureの塊で働いているかを示すコード:

string storageAccountName = "test"; 
    string storageAccountKey = @"testkey"; 
    string blobUrl = "https://test.blob.core.windows.net"; 
    string containerName = "testcontainer"; 
    string blobName = "testbontainer"; 

    var credentials = new StorageCredentialsAccountAndKey(storageAccountName, storageAccountKey); 
    var cloudBlobClient = new CloudBlobClient(blobUrl, credentials); 
    var containerReference = cloudBlobClient.GetContainerReference(string.Format("{0}/{1}", blobUrl, containerName)); 

    // OK - Result is of type CloudBlockBlob, cloudBlob_ListBlobs.Properties.LastModifiedUtc > DateTime.MinValue 
    var cloudBlob_ListBlobs = containerReference.ListBlobs().Where(i => i is CloudBlob && ((CloudBlob)i).Name == blobName).FirstOrDefault() as CloudBlob; 

    // WRONG - Result is of type CloudBlob, cloudBlob_GetBlobReference.Properties.LastModifiedUtc == DateTime.MinValue 
    var cloudBlob_GetBlobReference = containerReference.GetBlobReference(string.Format("{0}/{1}/{2}", blobUrl, containerName, blobName)); 

    // WRONG - Result is of type CloudBlockBlob, cloudBlob_GetBlockBlobReference.Properties.LastModifiedUtc == DateTime.MinValue 
    var cloudBlob_GetBlockBlobReference = containerReference.GetBlockBlobReference(string.Format("{0}/{1}/{2}", blobUrl, containerName, blobName)); 

答えて

34

私はあなたの属性/メタデータをフェッチするために別々の呼び出しを行うために持っていると信じています。 blob参照を取得したら、次の行を発行して属性を取得します。

cloudBlob_GetBlobReference.FetchAttributes();

+6

詳細については、GetBlobReference()はネットワークコールを行いません。これは、ちょうどあなたに正しいURLで初期化されたオブジェクトを返します。属性を取得するには、ネットワーク呼び出しを行う必要があります。また、.FetchAttributes()は最小限に行う(HEAD要求を行う)方法です。 – smarx

+0

ああ、ありがとう、私はGetBlobReference()がちょうどクライアント側のファクトリメソッドであることに気づいていなかった、私はそれがAzureに対して呼び出しを行うことを期待していた。今それは私には意味がある。 – Tiny

+0

貴重な答えが私をたくさん救った –

1

これはJava SDKに関連しています。しかしCloudBlobオブジェクトを派生したCloudBlockBlobオブジェクトの場合は、CloudBlob.downloadAttributes()コールが必要な場合があります。

関連する問題