【问题标题】:Azure Functions BlobTrigger Properties Binding ProblemAzure Functions BlobTrigger 属性绑定问题
【发布时间】:2020-12-11 10:01:21
【问题描述】:

我正在尝试创建一个 Azure 函数,它使用 BlobTrigger 来操作一些文件,然后将它们保存回 Blob。

为此,我希望能够访问 BlobProperties 对象以检查文件的 Content-Type,以确保我的操作例程支持它。

我从article 了解到,我应该能够简单地在名为 Properties 的方法上添加一个参数,该方法的类型为 BlobProperties,我可以确认这一点适用于列出的其他元数据类型。

但是,每当我添加属性时,我的应用程序就无法运行并报告以下错误:

“Function1”函数出错:Microsoft.Azure.WebJobs.Host:错误索引方法“Function1”。 Microsoft.Azure.WebJobs.Host:无法将参数“属性”绑定到类型“Microsoft.WindowsAzure.Storage.Blob.BlobProperties”。

我做错了什么?下面是我的方法:

public static void Run([BlobTrigger("TestContainer/{name}", Connection = "AzureWebJobsStorage")] Stream inputFile,
        string name, string BlobTrigger, IDictionary<string, string> Metadata, ILogger log, BlobProperties Properties)

我的目标框架是 .NET Core 3.1,Azure Functions 版本是 v3。 我有以下 NuGet 包:

  • Microsoft.Azure.WebJobs.Extensions.Storage 4.0.3
  • Microsoft.NET.Sdk.Functions 3.0.11

我看到一个类似的帖子建议删除对 Extensions.Storage 组件的引用,但这样做会删除 [BlobTrigger] 属性和其他类型,因此不起作用。相关问题似乎可以追溯到 2018 年,并且是针对旧版本的 Azure Function 的,这肯定可以解决吗?

感谢任何建议,提前谢谢。

【问题讨论】:

  • azure函数的参数类型是有限的。为什么不将 blob 视为像 blockblob 一样的对象,而是将其视为流?我认为像 blockblob 这样的类不应该导致序列化问题(我之前似乎做过类似的事情。)。传入blob对象并进行操作应该是可行的,大家可以试一试。
  • @BowmanZhu 对不起,我不确定我理解你的意思,你能提供一个例子吗?您是否建议将 inputFile 更改为键入 CloudBlockBlob?
  • 我已经把答案贴出来了,你可以看看试试。

标签: azure-functions azure-blob-trigger


【解决方案1】:

只需像下面这样:

using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;

namespace FunctionApp48
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([BlobTrigger("test/{name}", Connection = "str")]CloudBlockBlob myBlob, string name, ILogger log)
        {
            string a = myBlob.Properties.ContentType;
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Properties.Length} Bytes"+"\n"+a);
        }
    }
}

我可以成功获取blob的content-type:

以及参考包:

<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.10" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" />

【讨论】:

  • 是的,这在 3.0.10 版中运行良好,但在 4.0.3 版中失败。感谢您的帮助,我想现在我会坚持使用 Stream,并使用 IDictionary 元数据绑定来检查“hdi_isfolder”,我也可以使用 {name}.{extension} 过滤掉文件夹也是:)
  • 版本 3.0.10 也存在“字典中不存在 LogType”的问题,但这已在 3.0.11 中得到解决,并且已按预期工作。谢谢。
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2016-10-31
  • 2020-06-15
相关资源
最近更新 更多