使用Bearer Token的C# BlobClient StartCopyFromUriAsync操作异常排查
问题解答
原操作不可行的原因
你当前的代码返回404,本质不是源Blob不存在,而是StartCopyFromUriAsync默认会以匿名访问的方式请求源Blob URI。由于你的容器未开启匿名访问权限,Azure Storage会返回404(这是Storage的安全策略,避免直接泄露资源的存在性),而非明确的权限错误。
无需SAS URI的Blob复制解决方案
既然你拥有容器级的Storage Blob Data Contributor权限,完全可以通过直接读取源Blob内容并写入目标Blob的方式完成复制,全程不需要生成SAS URI。这种方式依赖你已有的TokenCredential权限,操作简单且可靠:
代码示例(流式复制,适合大文件)
var sourceClient = m_blobContainerClient.GetBlobClient(source); var targetClient = m_blobContainerClient.GetBlobClient(target); // 流式读写,避免将整个Blob加载到内存 using (var sourceStream = await sourceClient.OpenReadAsync()) { await targetClient.UploadAsync(sourceStream, overwrite: true); }
代码示例(小文件简化版)
如果Blob体积较小,也可以用内存缓存的方式快速实现:
var sourceClient = m_blobContainerClient.GetBlobClient(source); var targetClient = m_blobContainerClient.GetBlobClient(target); var downloadResult = await sourceClient.DownloadContentAsync(); await targetClient.UploadAsync(downloadResult.Value.Content, overwrite: true);
补充说明
同一容器内的Blob复制,用读写流的方式不仅避开了SAS的需求,还能直接利用你已有的容器级权限。相比StartCopyFromUriAsync,这种方式更可控,还能实时监控复制进度(如需)。
内容的提问来源于stack exchange,提问作者Uri Shapira
相关产品推荐
相关产品推荐

