Azure存储C#开发:CloudBlockBlob无Blob层级设置方法,如何修改?
解决C#修改Azure Blob层级的问题
哈哈,刚好之前处理过一模一样的问题!你提到的CloudBlockBlob属于旧版的Azure存储SDK(就是那个Microsoft.WindowsAzure.Storage包),确实没给直接设置Blob层级的方法,当初我也懵了一阵。不过不管是换用新版SDK,还是在旧代码里兼容处理,都能搞定把Blob从Hot改成Cool的需求,给你两种实用方案:
方案一:使用新版Azure Blob存储SDK(强烈推荐)
新版SDK是官方现在主推的,功能更全也更易用,而且已经封装了你提到的Set Blob Tier逻辑,步骤很简单:
先安装NuGet包:
用Package Manager控制台:Install-Package Azure.Storage.Blobs或者用.NET CLI:
dotnet add package Azure.Storage.Blobs编写代码修改Blob层级:
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; // 替换成你的存储账户连接字符串、容器名和Blob名 var connectionString = "Your_Storage_Account_Connection_String"; var containerName = "target-container"; var blobName = "example-blob.txt"; // 初始化Blob服务客户端 var blobServiceClient = new BlobServiceClient(connectionString); // 获取目标容器和Blob的客户端 var blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName); var blobClient = blobContainerClient.GetBlobClient(blobName); // 直接调用API将层级从Hot改为Cool await blobClient.SetAccessTierAsync(AccessTier.Cool);这个方法内部已经帮你处理了REST请求的签名和调用,不用自己手动写底层逻辑。
方案二:在旧版SDK中手动调用REST API(兼容现有旧代码)
如果暂时没法迁移到新版SDK,也可以手动构造REST请求来实现。这里有两种写法:
写法一:用HttpClient发送签名后的请求
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using System.Net.Http; using System.Threading.Tasks; var storageAccount = CloudStorageAccount.Parse("Your_Storage_Account_Connection_String"); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference("target-container"); var blockBlob = container.GetBlockBlobReference("example-blob.txt"); // 构造Set Blob Tier的请求地址 var targetTier = "Cool"; var requestUri = $"{blockBlob.Uri}?comp=tier&tier={targetTier}"; // 用存储账户凭证签名请求 var request = new HttpRequestMessage(HttpMethod.Put, requestUri); storageAccount.Credentials.SignRequest(request); // 发送请求并确保成功 using (var httpClient = new HttpClient()) { var response = await httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); }
写法二:用旧SDK的ExecuteAsync方法
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using System.Threading.Tasks; var storageAccount = CloudStorageAccount.Parse("Your_Storage_Account_Connection_String"); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference("target-container"); var blockBlob = container.GetBlockBlobReference("example-blob.txt"); // 调用ExecuteAsync执行Set Tier操作 await blockBlob.ExecuteAsync( HttpMethod.Put, new BlobRequestOptions(), new OperationContext(), new[] { new NameValuePair("comp", "tier"), new NameValuePair("tier", "Cool") });
最后提一句:旧版SDK已经停止维护了,官方也建议尽快迁移到新版,后续的新功能和bug修复都只会在新版SDK里更新哦。
内容的提问来源于stack exchange,提问作者Martin Dawson
相关产品推荐
相关产品推荐

