새 저장소 API를 사용하여 SAS를 만들고 한 컨테이너에서 다른 컨테이너로 BLOB를 복사하는 비교적 간단한 방법이 있습니다.Microsoft.WindowsAzure.Storage가있는 공유 액세스 토큰을 만듭니다. 403
저장 용량 계정간에 blob을 복사하는 데이 도구를 사용하려고합니다. 따라서 정확히 동일한 컨테이너를 사용하는 TWo Storage 계정이 있고 저장소 계정의 컨테이너에서 다른 저장소 계정의 컨테이너로 BLOB를 복사하려고합니다.
SDK가 내장되어 있는지 잘 모르겠지만 일반적인 시나리오처럼 보입니다.
몇 가지 추가 정보 :
- 나는 대상 컨테이너에 토큰을 생성합니다. 해당 토큰을 원본과 대상 모두에서 만들어야합니까? 토큰을 등록하는 데 시간이 걸립니까? 각 요청에 대해 또는 토큰 "수명"당 한 번만 생성해야합니까?
내가 언급해야 할 것은 승인되지 않은 결과 http 오류 코드입니다. Azure.Storage의 내 버전 2.1.0.2
var uri = new Uri(srcBlob.Uri.AbsoluteUri + blobToken);
destBlob.StartCopyFromBlob(uri);
이다 : 나는 403 반환하는 복사 작업을 호출이 토큰을 사용하는 라인 아래
private static string CreateSharedAccessToken(CloudBlobClient blobClient, string containerName)
{
var container = blobClient.GetContainerReference(containerName);
var blobPermissions = new BlobContainerPermissions();
// The shared access policy provides read/write access to the container for 10 hours:
blobPermissions.SharedAccessPolicies.Add("SolutionPolicy", new SharedAccessBlobPolicy()
{
// To ensure SAS is valid immediately we don’t set start time
// so we can avoid failures caused by small clock differences:
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
Permissions = SharedAccessBlobPermissions.Write |
SharedAccessBlobPermissions.Read
});
blobPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
container.SetPermissions(blobPermissions);
return container.GetSharedAccessSignature(new SharedAccessBlobPolicy(), "SolutionPolicy");
}
.
private static void CopyBlobs(
CloudBlobContainer srcContainer, string blobToken,
CloudBlobContainer destContainer)
{
var srcBlobList
= srcContainer.ListBlobs(string.Empty, true, BlobListingDetails.All); // set to none in prod (4perf)
//// get the SAS token to use for all blobs
//string token = srcContainer.GetSharedAccessSignature(
// new SharedAccessBlobPolicy(), "SolutionPolicy");
bool pendingCopy = true;
foreach (var src in srcBlobList)
{
var srcBlob = src as ICloudBlob;
// Determine BlobType:
ICloudBlob destBlob;
if (srcBlob.Properties.BlobType == BlobType.BlockBlob)
{
destBlob = destContainer.GetBlockBlobReference(srcBlob.Name);
}
else
{
destBlob = destContainer.GetPageBlobReference(srcBlob.Name);
}
// Determine Copy State:
if (destBlob.CopyState != null)
{
switch (destBlob.CopyState.Status)
{
case CopyStatus.Failed:
log.Info(destBlob.CopyState);
break;
case CopyStatus.Aborted:
log.Info(destBlob.CopyState);
pendingCopy = true;
destBlob.StartCopyFromBlob(destBlob.CopyState.Source);
return;
case CopyStatus.Pending:
log.Info(destBlob.CopyState);
pendingCopy = true;
break;
}
}
// copy using only Policy ID:
var uri = new Uri(srcBlob.Uri.AbsoluteUri + blobToken);
destBlob.StartCopyFromBlob(uri);
//// copy using src blob as SAS
//var source = new Uri(srcBlob.Uri.AbsoluteUri + token);
//destBlob.StartCopyFromBlob(source);
}
}
을 마지막으로 계정 및 클라이언트 (심사) 코드 : 여기
도움이 경우 전체 복사 방법입니다 var credentials = new StorageCredentials("BAR", "FOO");
var account = new CloudStorageAccount(credentials, true);
var blobClient = account.CreateCloudBlobClient();
var sasToken = CreateSharedAccessToken(blobClient, "content");
나는이 작업을 보인다 REST 클라이언트를 사용하는 경우 ... 어떤 아이디어?
은 얼마나 많은 시간을 당신은 SAS의 생성 및 복사의 URL의 사용 사이에 발생? – MikeWo
즉시 발생합니다. SAS 메소드를 호출하고 나중에 밀리 초가 StartCopyFromBlob() API 호출을 호출합니다. uri를 인코딩하는 것과 관련이있을 수 있습니까? REST 클라이언트는 작동하지만 Azure SDK는 실패하지만 아무런 해결책도 발견하지 못했다는보고를 보았습니다. – nocarrier
방금 문제가 다른 두 계정간에 진행된다는 것을 깨달았습니다. 이는 두 계정 (대상 및 출처) 모두에 대해 creds가 필요하다는 것을 의미한다고 생각하십니까? SAS가 BLOB 콘텐츠 서버에서 어떻게 작동하는지 잘 모르겠다. – nocarrier