-1

当我尝试在 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>

谢谢你的帮助

4

1 回答 1

0

更新

在 Microsoft Flow 中,针对 Azure 存储调用 Rest Api 似乎不是一种有效的方法。授权需要将流发送的 x-ms-* 标头(如 x-ms-tracking-id、x-ms-workflow-id 等)添加到 stringStr,这不在我们的控制范围内。更重要的是,签名仅在生成后的 15m 内有效。

有一个内置的Get Blob Metadata动作。对于存储,也可以使用其他常见操作。

要设置 blob 元数据,我建议将逻辑托管在 Azure 函数中。

  1. 按照本教程创建函数应用程序和 httptrigger 函数,记得选择我们需要设置 blob 元数据的存储帐户。

  2. 用下面的代码替换 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");
        }
    }
    
  3. 在 Microsoft Flow 中,创建一个 Http 操作,将下面的内容发布到步骤 2 中获取的函数 url。

    {
        "metadata": "test",
        "blobName":"myblob",
        "containerName":"mycontainer"
    }
    
于 2018-09-21T04:24:27.743 回答