当我尝试在Microsoft Flow中调用此https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-metadata API时,总是收到400错误请求的错误。
我编辑了关于此答案https://stackoverflow.com/a/22029178/10389562的授权标头,但无法理解我在做什么错。
Method: GET
Uri: https://myaccount.blob.core.windows.net/containername/blobname?comp=metadata
Headers :
{
"Authorization": "SharedKey storageaccountname: primary key in the storage
account properties",
"x-ms-date": "Thu, 21 Sep 2018 23:45:00 GMT",
"x-ms-version": "2018-03-28"
}
调用此API后,我得到了此输出
<?xml version="1.0" encoding="utf-8"?><Error>
<Code>InvalidAuthenticationInfo</Code><Message>Authentication information is
not given in the correct format. Check the value of Authorization header.
RequestId:f3b3051b-601e-00a4-4b3c-51c58d000000
Time:2018-09-20T23:46:40.6659210Z</Message></Error>
感谢您的帮助
答案 0 :(得分:0)
更新
在Microsoft Flow中,对Azure存储调用Rest Api似乎不是有效的方法。授权需要由流发送的x-ms- *标头(例如x-ms-tracking-id,x-ms-workflow-id等)添加到stringStr中,这不受我们的控制。而且,签名自生成以来仅有效15m。
有一个内置的Get Blob Metadata
操作。对于存储,还可以使用其他常见操作。
要设置blob元数据,建议将逻辑托管在Azure函数中。
按照this tutorial创建Function应用程序和httptrigger函数,请记住选择要在其中设置blob元数据的存储帐户。
用下面的代码替换httptrigger示例,并根据需要修改metadataName
。
#r "Microsoft.WindowsAzure.Storage"
using System.Net;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
dynamic data = await req.Content.ReadAsAsync<object>();
if (data == null)
{
return req.CreateResponse(HttpStatusCode.BadRequest, "No request body posted");
}
else
{
string metadata = data.metadata;
string blobName = data.blobName;
string containerName = data.containerName;
try
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
CloudBlob blob = blobContainer.GetBlobReference(blobName);
blob.Metadata.Add("metadataName", metadata);
blob.SetMetadata();
}
catch (Exception e)
{
log.Error(e.ToString());
return req.CreateResponse(HttpStatusCode.InternalServerError, "Fail to set metadata");
}
return (string.IsNullOrEmpty(metadata) || string.IsNullOrEmpty(blobName) || string.IsNullOrEmpty(containerName))
? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass necessary parameters in the request body")
: req.CreateResponse(HttpStatusCode.OK, $"Metadata of {blobName} has been set");
}
}
在Microsoft Flow中,创建一个Http操作,将下面的内容发布到步骤2中获得的函数url中。
{
"metadata": "test",
"blobName":"myblob",
"containerName":"mycontainer"
}