我正在尝试在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订阅,并查看它是否可以解决任何问题。
答案 0 :(得分:1)
因此,在进行一些测试之后,看来这是一个与开发/测试订阅无关的问题。我不得不将头撞在墙上一天以解决这个问题,这有点令人沮丧,但我想这就是游戏的名称。
希望这可以帮助其他人解决这个问题。