我尝试将blob从一个Azure存储帐户复制到另一个存储帐户(相同的订阅),但我得到一个例外:
指定的资源不存在。
正如我所知,问题是由容器设置为Private
引起的,这是我们的业务目的。
我从this SO answer提出了暗示:
在源blob上创建共享访问签名(SAS),至少具有读取权限且有效期至少为15天,并使用该SAS URL(blob URL + SAS令牌)作为复制源。
此外,我在同一张海报上的Microsoft forums找到了一些代码,在那里他发布了适合他的代码。从那时起,我现在有以下代码(ct
是CancellationToken
):
var snapshot = await blob.CreateSnapshotAsync(ct);
var sourceSAS = snapshot.GetSharedAccessSignature(new SharedAccessBlobPolicy {
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.Now.AddYears(1),
SharedAccessStartTime = DateTimeOffset.Now.AddHours(-1)
});
var sourceUri = $"{snapshot.Uri}{sourceSAS}";
var backupBlob = FileBackupContainer.GetBlockBlobReference(blob.Name);
var targetSAS = backupBlob.GetSharedAccessSignature(new SharedAccessBlobPolicy {
Permissions = SharedAccessBlobPermissions.Write,
SharedAccessExpiryTime = DateTime.Now.AddYears(1),
SharedAccessStartTime = DateTimeOffset.Now.AddHours(-1)
});
var targetUri = $"{backupBlob.Uri}{targetSAS}";
var newTargetBlob = new CloudBlockBlob(new Uri(targetUri));
await newTargetBlob.StartCopyAsync(new Uri(sourceUri), ct);
await snapshot.DeleteAsync(ct);
但我仍然遇到同样的例外。
使用SAS复制blob还需要什么?
更新
我的代码不起作用,因为源blob在我的本地存储模拟器(即 localhost)中,这显然是由Azure托管的目标存储容器无法访问的。
答案 0 :(得分:1)
回答我自己的问题......
我的代码不起作用,因为源blob位于我的本地存储模拟器(即localhost)中,这显然是由Azure托管的目标存储容器无法访问的。