c# - 如何在公共(public)访问设置为 'Private' 的容器中复制 blob?

标签 c# azure azure-blob-storage

我需要能够将 blob 从 1 个存储帐户中的容器复制到另一个存储帐户中的容器中。以前,源容器的公共(public)访问权限设置为“容器”。我使用连接字符串连接到帐户,然后获取对 blob 的引用。

我正在使用 StartCopyAsync(sourceBlob)。当容器将公共(public)访问设置为容器时,这最初工作正常。现在它抛出“指定的资源不存在”的 StorageException。这是权限问题吗?我本以为会出现一条错误消息,指出我没有权限。我可以看到资源在容器中。

假设这是一个权限问题,有没有办法从公共(public)访问设置为“私有(private)”的容器中复制 blob?文档建议可以通过“授权请求”来完成,但是你该怎么做呢?

更新

我已经尝试了 Gaurav Mantri 的建议,但目前收到错误“此请求无权执行此操作”。这是我的代码:

    private async Task<FileActionResult> CopyBlob(string blobName, string sourceBlobSasToken, string sourceBlobName, CloudBlockBlob targetBlob)
    {
        try
        {
            await targetBlob.StartCopyAsync(new Uri(sourceBlobSasToken));
            var targetBlobRef = await _connectionFactory.GetContainerConnection(BlobContainerType.myTargetContainer).GetBlobReferenceFromServerAsync(targetBlob.Name);

            while (targetBlobRef.CopyState.Status == CopyStatus.Pending)
            {
                await Task.Delay(500);
                targetBlobRef = await _connectionFactory.GetContainerConnection(BlobContainerType.myTargetContainer).GetBlobReferenceFromServerAsync(targetBlob.Name);
            }

            if (targetBlobRef.CopyState.Status == CopyStatus.Success)
            {
                return new FileActionResult(blobName, true);
            }
            else
            {
                var errorMessage = $"{blobName} failed to copy from '{sourceBlobName}' to '{targetBlob}'. Status: {targetBlobRef.CopyState.Status}";
                _logServiceApi.Trace(errorMessage);
                return new FileActionResult(blobName, false, errorMessage);
            }
        }
        catch (StorageException ex)
        {
            _logServiceApi.LogException(ex);
            return new FileActionResult(blobName, false, ex.Message);
        }
        catch (AggregateException ex)
        {
            _logServiceApi.LogException(ex);
            return new FileActionResult(blobName, false, ex.Message);
        }
    }

“sourceBlobSasToken”由这段代码检索并传入:

    public string GetFileStorageBlobSasUri(BlobContainerType blobContainer, string fileName, double tokenDuration, long? projectId = null)
    {
        var blob = GetBlockBlob(blobContainer, fileName, projectId);

        var adHocPolicy = new SharedAccessBlobPolicy()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(tokenDuration),
            Permissions = SharedAccessBlobPermissions.Read
        };

        var sasContainerToken = blob.GetSharedAccessSignature(adHocPolicy);
        return blob.Uri + sasContainerToken;
    } 

最佳答案

确实是权限问题。为了使复制 blob 操作正常工作,源 blob 必须可公开访问。从这里link :

enter image description here

当容器的 ACL 是公开的时,源 Blob 是可公开访问的,即任何人都可以通过其 URL 直接访问该 Blob。但是,一旦将容器的 ACL 更改为私有(private),源 blob 就不再可公开访问。

要解决您的问题,您需要做的是为源 blob 创建一个至少具有读取权限的 SAS URL,并在 StartCopyAsync 中使用该 SAS URL。方法。

关于c# - 如何在公共(public)访问设置为 'Private' 的容器中复制 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67941084/

相关文章:

azure - Azure Blob 存储容器名称可以不区分大小写吗?

时间:2019-03-17 标签:c#SetupProjectLocalization

c# - MongoDB 更新文档并添加新属性

c# - 我可以将枚举传递给 Controller ​​以便模型绑定(bind)器绑定(bind)它吗?

java - com.microsoft.azure.documentdb.DocumentClientException 日期 header 不符合所需的格式

azure - SharePoint 在线 OAuth2 token invalid_scope

Azure Web应用程序: CDN + application service vs Blob storage

c# - ToolStripDropDownMenu 在表单最小化和恢复后保持打开状态

Azure 逻辑应用 - Liquid 连接器 - Liquid 模板引擎的版本/风格?

javascript - 在新选项卡中显示来自 Azure Blob 存储容器的 PDF 文件