0

c# を使用して、新しいリソースの共有アクセス署名を作成しています (ストレージ アカウントに新しいリソースを作成するには、ユーザーに作成権限が必要です)。MS のドキュメントは古くなっているため、私が経験したさまざまなブログ投稿を使用して動作させることができないようです。

現在、私のコードは次のようになっています。

public static string GetBlobSharedAccessSignitureUrl(CloudBlobContainer container,string nameOfBlobToCreateSaSfor)
        {
            var blob = container.GetBlockBlobReference(nameOfBlobToCreateSaSfor);
            var policy = new SharedAccessBlobPolicy
                             {
                                 SharedAccessExpiryTime = DateTime.Now.AddHours(1),
                                 Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read
                             };


            container.GetSharedAccessSignature(policy);
            string sas = blob.GetSharedAccessSignature(policy);

            return blob.Uri.AbsoluteUri + sas;

        }

そして返されたURL(私のローカルマシン用)は次のようになります(正しいようです)

http://127.0.0.1:10000/devstoreaccount1/photos/photos_4.jpg?sv=2012-02-12&se=2013-01-20T10%3A13%3A17Z&sr=b&sp=rw&sig=xxx

Azure ストレージ シミュレーターを起動し、フィドラーを介してこの URL に POST しようとしました (PUT も試しました)

エラーが発生します ( 404 または 400 、試したこの関数の別のコードによって異なります)

他に何かする必要がありますか?(古い例では、事前にその場所にリソースを作成するのを見ました-これも試しましたが、どちらも機能しませんでした...)

Azure SDK のバージョンは 2.0 であるため、2012 年 10 月より前の MS ブログの投稿 (およびその他のチュートリアル) は壊れています (MS dev ブログによるとhttp://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/windows -azure-storage-client-library-2-0-breaking-changes-amp-migration-guide.aspx )

任意の助けをいただければ幸いです

4

2 に答える 2

1

Fiddler またはコードを使用して投稿する場合は、必ず "x-ms-blob-type" 要求ヘッダーを追加し、その値を "BlockBlob" として設定してください。ファイルをアップロードしようとするこのサンプル コードを見てください。

                FileInfo fInfo = new FileInfo(fileName);//fileName is the full path of the file.
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(blobSaSUrl);
                NameValueCollection requestHeaders = new NameValueCollection();
                requestHeaders.Add("x-ms-blob-type", "BlockBlob");
                req.Method = "PUT";
                req.Headers.Add(requestHeaders);
                req.ContentLength = fInfo.Length;
                byte[] fileContents = new byte[fInfo.Length];
                using (FileStream fs = fInfo.OpenRead())
                {
                    fs.Read(fileContents, 0, fileContents.Length);
                    using (Stream s = req.GetRequestStream())
                    {
                        s.Write(fileContents, 0, fileContents.Length);
                    }
                    using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                    {
                    }
                }
于 2013-01-20T12:01:27.020 に答える
0

1 時間有効な SAS トークンを作成します。

BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
    BlobContainerName = containerName,
    BlobName = blobName,
    Resource = "b",
    StartsOn = DateTimeOffset.UtcNow,
    ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
};

SAS の読み取りアクセス許可を指定します。

sasBuilder.SetPermissions(BlobSasPermissions.Read);

キーを使用して SAS トークンを取得します。

string sasToken = sasBuilder.ToSasQueryParameters(key, accountName).ToString();

SAS トークンを含む完全な URI を構築します。

UriBuilder fullUri = new UriBuilder()
{
    Scheme = "https",
    Host = string.Format("{0}.blob.core.windows.net", accountName),
    Path = string.Format("{0}/{1}", containerName, blobName),
    Query = sasToken
};
于 2020-02-20T20:11:07.973 に答える