3

Windows Azure ストレージ クライアント ライブラリの v2.0を使用して、BLOB の Shared Access Signature を生成 (および使用) しようとしています。このサンプルから始めましたが、v1.7 用で、2.0 に置き換えると 404 エラーが発生します。

これが私の実際のコードです:サーバー側、SASを生成する:

var myAccount = CloudStorageAccount.Parse(
                  ConfigurationManager.ConnectionStrings[
                              "AzureStorageConnectionString"].ConnectionString);
var myContainer = myAccount.CreateCloudBlobClient()
                                          .GetContainerReference(containerName);
myContainer.CreateIfNotExists();

string blobName = "Imports/" + DateTime.UtcNow.ToString("yyyy-MM-dd_HH-mm-ss") 
                             + ".zip";
var myBlob = myContainer.GetBlockBlobReference(blobName);
using (var stream = 
 new MemoryStream(System.Text.Encoding.UTF8.GetBytes("Hey, I'm empty for now.")))
{
    myBlob.UploadFromStream(stream);
}

var sharedAccesSignature = myBlob.GetSharedAccessSignature(
                 new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy()
{
   Permissions = 
       Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Write 
       | Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read,
       SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
});

return myBlob.Uri.AbsoluteUri + sharedAccesSignature;

クライアント側で多くのことを試みた結果、404 または 403 サーバー エラーが発生することがありました。たとえば、私はこれを試しました(結果:404):

var blobClient = new CloudBlobClient(new Uri(blobWithSharedAccessSignature));
// blobWithSharedAccessSignature here is : https://azertyuiop.blob.core.windows.net/container1/Imports/2012-12-01_19-43-54.zip?sv=2012-02-12&se=2012-12-01T20%3A43%3A54Z&sr=b&sp=rw&sig=h0bTUk[...]3D
// calling blobWithSharedAccessSignature from a webBrowser works.
// result here is valid for containerName : container1
var container = blobClient.GetContainerReference(containerName);
ICloudBlob blobRef = container.GetBlobReferenceFromServer(blobWithSharedAccessSignature);   ==> error 404
using (var fileStream = File.OpenRead(fileFullPath))
{
    blobRef.UploadFromStream(fileStream);
}

交換してみました

container.GetBlobReferenceFromServer(blobWithSharedAccessSignature);

container.GetBlockBlobReference(blobWithSharedAccessSignature);

私も交換してみました

blobClient = new CloudBlobClient(new Uri(blobWithSharedAccessSignature));

blobClient = new CloudBlobClient(new Uri(blobWithSharedAccessSignature), new StorageCredentials(blobWithSharedAccessSignature));

その結果、「403 - 禁止」エラーが発生します。

v2 の完全なサンプルを提供してくれる人はいますか? それとも私の間違いだったと教えてください。ありがとう !

更新 - ここでの解決策: (Sandrino Di Mattia に感謝)

// Assuming that blobWithSharedAccessSignature is : 
//  "https://azertyuiop.blob.core.windows.net/container1/Imports/2012-12-01_19-43-54.zip?sv=2012-02-12&se=2012-12-01T20%3A43%3A54Z&sr=b&sp=rw&sig=h0bTUkTR%2FdTF%2BVZgDUuBPHqG%2BiTtFeXK4kepBpDR2AU%3D"
Uri blobUriWithoutCredentials = new Uri(new Uri(blobWithSharedAccessSignature).GetLeftPart(UriPartial.Path));
// here blobUriWithoutCredentials is https://azertyuiop.blob.core.windows.net/container1/Imports/2012-12-01_19-43-54.zip
string credentials = blobWithSharedAccessSignature.Substring(blobWithSharedAccessSignature.IndexOf('?'));
// here credentials is "?sv=2012-02-12&se=2012-12-01T22%3A26%3A55Z&sr=b&sp=rw&sig=Lsk8kLyJ8TFoGNVLbFLftCIXUNlIIRPZalkhoPdUfh8%3D"
var blobClient = new CloudBlobClient(blobUriWithoutCredentials, new StorageCredentials(credentials));
ICloudBlob blobRef = blobClient.GetBlobReferenceFromServer(blobUriWithoutCredentials);
using (var fileStream = File.OpenRead(fileFullPath))
{
    blobRef.UploadFromStream(fileStream);
}
4

1 に答える 1

7

を初期化するときは、CloudBlobClient2 つのパラメーターを渡す必要があります

  • baseUri : SAS を含まない BLOB の URL、http://test.blob.core.windows.net/temp/Imports/2012-12-01_20-56-52.zip
  • credentials : これは、URL のない SAS である必要があります。?sv=2012-02-12&se=2012-12-01T21%3A57%3A56Z&sr=b&sp=rw&sig=5JboXXM1Yeo%2BuI6mb18VbURluo%3D

作業サンプル:

var blobClient = new CloudBlobClient(new Uri(blob.Uri.AbsoluteUri), new StorageCredentials(sharedAccesSignature));
using (var fileStream = File.OpenRead(fileFullPath))
{

    blobClient.GetBlobReferenceFromServer(new Uri(blob.Uri.AbsoluteUri))
                .UploadFromStream(fileStream);
}

追加のヒント: コンテナーへの参照を取得する必要はありません。GetBlobReferenceFromServerを呼び出して、すぐにブロブにアクセスできますCloudBlobClient

于 2012-12-01T21:02:46.253 に答える