加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Azure存储客户端库的v2进行共享访问签名时出现404错误

发布时间:2020-12-16 01:51:37 所属栏目:百科 来源:网络整理
导读:我正在尝试使用 Windows Azure存储客户端库的v2.0为blob生成共享访问签名(并使用它). 我从 this sample开始,但它是v1.7,并将其转换为2.0会产生404错误. 这是我的实际代码: 服务器端,生成SAS: var myAccount = CloudStorageAccount.Parse( ConfigurationMan
我正在尝试使用 Windows Azure存储客户端库的v2.0为blob生成共享访问签名(并使用它).
我从 this sample开始,但它是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);
}

解决方法

初始化CloudBlobClient时,您需要传递2个参数

> baseUri:没有SAS的Blob网址,http://test.blob.core.windows.net/temp/Imports/2012-12-01_20-56-52.zip
>凭证:这应该是没有网址的SAS,?sv = 2012-02-12& se = 2012-12-01T21:57:56Z& sr = b& sp = rw& sig = 5JboXXM1Yeo + uI6mb18VbURluo =

工作样本:

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);
}

额外提示:您无需获取对容器的引用.您可以通过调用CloudBlobClient上的GetBlobReferenceFromServer立即访问blob.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读