将容器名称作为参数传递给BlobTrigger

时间:2018-08-20 16:35:03

标签: azure azure-storage azure-functions

我有一个C#小应用程序,当将新的blob添加到存储帐户中的容器时,它会做一些事情。

我正在使用Visual Studio 2017在本地工作。

VS模板给了我

using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace LogicAppTriggerFunction
{
    public static class BlobTrigger
    {
        [FunctionName("BlobTrigger")]
        public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "")]Stream myBlob, string name, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        }
    }
}

我正在尝试将"samples-workitems"替换为与容器名称相关的变量。我只想使用一个容器,但不想对其进行“硬编码”。

如果我在右边,则此设置存储在编译时构建的function.json中。在本地工作时,我认为/认为function.json会读取local.settings.json的内容,但是我现在认为这是针对appSettings.json的。

要读取MS doco,尤其是在trigger bindings上,似乎应该从function.json中读取myContainer/{name}。我了解到function.json是动态构建的,不应修改。

我尝试了各种我知道的方法来替换字符串myContainer/{name},但它们都会导致错误:

[20/08/2018 14:56:36] Run: Microsoft.Azure.WebJobs.Host: Error indexing method 'TriggerLogicApp.Run'. Microsoft.Azure.WebJobs.Host: Invalid blob trigger path '{container}/{name}'. Container paths cannot contain {resolve} tokens.

我相信我需要做的是以编程方式“创建”(或更新)path中的function.json值,但是我不知道该怎么做。

任何人都可以阐明我需要做什么以及可能如何做吗?

2 个答案:

答案 0 :(得分:1)

在本地local.settings.json或Azure上的“应用程序设置”中指定容器名称。

{
    "IsEncrypted": false,
    "Values": {
        ....
        "MyBlobContainer":"samples-workitems"
    }
}

在函数签名中,使用用百分号包裹的App setting binding expressions

public static void Run([BlobTrigger("%MyBlobContainer%/{name}", Connection = "")]Stream myBlob, string name, ILogger log)

答案 1 :(得分:1)

您是否考虑过使用EventGridTrigger而不是使用BlobTrigger?

您的函数将接收来自Storage Accounts主题的预订事件,并且需要逻辑来忽略/丢弃无趣的事件,但是好处是,您将在{{1 }}或事件的subject结构。

这是该结构的样子(来自MSDN):

data.url