从Azure功能连接到Azure Blob存储

时间:2018-12-11 13:27:27

标签: c# azure azure-storage azure-functions azure-storage-blobs

我正在尝试在v2函数应用程序中使用CloudBlobClient c#类从存储在Azure Blob存储上的文件中读取数据。在本地运行时,我的代码可以拉回数据,但是,当代码使用相同的连接字符串部署并且我的代码调用GetBlobReferenceFromServerAsync时,出现以下错误:

Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

我从“存储帐户”>“访问密钥”>“ Key1的连接字符串”中获取了连接字符串,其格式如下:

DefaultEndpointsProtocol=https;AccountName=<AccountName>;AccountKey=<AccountKey>;EndpointSuffix=core.windows.net

我曾尝试向App Service帐户所有者授予对存储帐户的访问权限,并尝试使用共享访问签名,但是到目前为止,任何方法都没有起作用。要使此功能正常工作,是否需要在Function App或Storage Account端上应用某些权限?

下面是代码段:

var storageConnectionString = blobConfig.ConnectionString;
if (CloudStorageAccount.TryParse(storageConnectionString, out var storageAccount))
{
    try
    {
        // Create the CloudBlobClient that represents the Blob storage endpoint for the storage account.
        var cloudBlobClient = storageAccount.CreateCloudBlobClient();

        var container = cloudBlobClient.GetContainerReference(containerName);
        var uri = new Uri(cloudBlobClient.BaseUri, $"/{containerName}{path}");

        // get the blob object and download to file
        // ---- THROWS ON NEXT LINE ----
        var blobRef = await cloudBlobClient.GetBlobReferenceFromServerAsync(uri); 

        var tempFilePath = System.IO.Path.GetTempFileName();
        await blobRef.DownloadToFileAsync(tempFilePath, System.IO.FileMode.Truncate);

        return tempFilePath;
    }
    catch (StorageException ex)
    {
        log.LogError(ex, "Error returned from the service: {0}", ex.Message);
        throw;
    }
}

修改 我应该提到此功能的部署版本正在Azure开发/测试订阅上运行。不知道这是否正在发挥作用。我将尝试部署到非Dev订阅,并查看它是否可以解决任何问题。

1 个答案:

答案 0 :(得分:1)

因此,在进行一些测试之后,看来这是一个与开发/测试订阅无关的问题。我不得不将头撞在墙上一天以解决这个问题,这有点令人沮丧,但我想这就是游戏的名称。

希望这可以帮助其他人解决这个问题。