Azure通用v2存储容器代码标记Blob报错,工具可正常操作
问题场景
近期在Azure通用v2(General Purpose v2)存储容器中使用Blob标记功能,Azurite本地环境不支持该功能,部署到云端后调用以下代码标记Blob时抛出异常:
public async Task SetTagsOnBlobAsync(BlobBaseClient blob, IDictionary<string, string> tags) { await blob.SetTagsAsync(tags).ConfigureAwait(false); }
使用的NuGet包为Azure.Storage.Blobs v12.16.0,Azure门户显示存储账户为通用v2类型,但代码执行时收到如下异常:
Blob tags are only supported on General Purpose v2 storage accounts. RequestId:160b0660-a01e-0047-23d8-8fbf8d000000 Time:2023-05-26T13:46:42.3539235Z Status: 400 (Blob tags are only supported on General Purpose v2 storage accounts.) ErrorCode: BlobTagsNotSupportedForAccountType Content: BlobTagsNotSupportedForAccountTypeBlob tags are only supported on General Purpose v2 storage accounts. RequestId:160b0660-a01e-0047-23d8-8fbf8d000000 Time:2023-05-26T13:46:42.3539235Z Headers: x-ms-error-code: BlobTagsNotSupportedForAccountType x-ms-request-id: 160b0660-a01e-0047-23d8-8fbf8d000000 x-ms-version: 2022-11-02 x-ms-client-request-id: 41028c76-7b82-4349-b65d-a100a1481c57 Content-Length: 272 Content-Type: application/xml Date: Fri, 26 May 2023 13:46:42 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
矛盾点:通过Azure Storage Explorer、其他控制台程序能给同一Blob成功添加标记,怀疑是UploadAsync返回后Blob未完全就绪就发起标记请求的时序问题。
排查与解决方案
1. 确保上传操作完全完成
BlobClient.UploadAsync返回时,Blob的元数据或状态可能仍在云端异步处理中,需确保上传操作彻底完成:
- 检查
UploadAsync返回的Response<BlobContentInfo>对象,确认ETag和LastModified属性有效; - 如果使用分块上传,必须调用
CommitBlockListAsync完成上传流程,避免Blob处于未完成状态。
2. 添加重试机制
针对Azure存储的异步一致性延迟,给标记操作添加指数退避重试,示例代码如下:
public async Task SetTagsOnBlobAsync(BlobBaseClient blob, IDictionary<string, string> tags) { int retryCount = 3; TimeSpan delay = TimeSpan.FromSeconds(1); for (int i = 0; i <= retryCount; i++) { try { await blob.SetTagsAsync(tags).ConfigureAwait(false); return; } catch (RequestFailedException ex) when (ex.ErrorCode == "BlobTagsNotSupportedForAccountType" && i < retryCount) { await Task.Delay(delay).ConfigureAwait(false); delay *= 2; // 指数退避 } } // 重试失败后抛出原异常 await blob.SetTagsAsync(tags).ConfigureAwait(false); }
3. 验证存储账户类型准确性
通过Azure CLI确认存储账户类型,避免门户显示延迟:
az storage account show --name <你的存储账户名> --resource-group <资源组名> --query kind
返回结果应为StorageV2,确认账户确实是通用v2类型。
4. 检查BlobClient实例有效性
确保用于标记的BlobBaseClient实例指向正确的存储账户,避免误用了其他类型账户的客户端(比如复制粘贴错误的连接字符串)。
总结
最可能的原因是Blob上传后的云端异步一致性延迟,导致标记请求发起时系统未同步Blob的账户类型信息。通过确保上传完成、添加重试机制即可解决该问题。
内容的提问来源于stack exchange,提问作者awj

