c# – 使用Azure存储客户端库的v2进行共享访问签名时出现404错误
我正在尝试使用
Windows Azure存储客户端库的v2.0为blob生成共享访问签名(并使用它).
我从 this sample开始,但它是v1.7,并将其转换为2.0会产生404错误. 这是我的实际代码: 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服务器错误. 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 工作样本: 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |