【问题标题】:Passing container name as a parameter to BlobTrigger将容器名称作为参数传递给 BlobTrigger
【发布时间】:2019-01-26 20:08:56
【问题描述】:

我有一个小 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 文档,尤其是在 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.

我相信我需要做的是以编程方式“创建”(或更新)function.json 中的 path 值,但我不知道如何执行此操作。

谁能阐明我需要做什么以及如何做?

【问题讨论】:

    标签: azure azure-storage azure-functions


    【解决方案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)
    

    【讨论】:

    • 谢谢@Jerry Liu。您的解决方案正是我所需要的。为什么 MS 文档不能这么说...
    • 如何使用管道对其进行参数化?
    • @woter324 检查here (MS Docs)
    • 除了 jerry 的回答之外,您还可以使用冒号引用嵌套值,例如 "%JobOptions:ContainerName%"
    【解决方案2】:

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

    您的函数将接收来自 Storage Accounts 主题的订阅事件,并且需要逻辑来忽略/丢弃不感兴趣的事件,但好处是您将在 subject 或事件的data.url 结构。

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

    [{
      "topic": "/subscriptions/{subscriptionid}/resourceGroups/eg0122/providers/Microsoft.Storage/storageAccounts/egblobstore",
      "subject": "/blobServices/default/containers/{containername}/blobs/blobname.jpg",
      "eventType": "Microsoft.Storage.BlobCreated",
      "eventTime": "2018-01-23T17:02:19.6069787Z",
      "id": "{guid}",
      "data": {
        "api": "PutBlockList",
        "clientRequestId": "{guid}",
        "requestId": "{guid}",
        "eTag": "0x8D562831044DDD0",
        "contentType": "application/octet-stream",
        "contentLength": 2248,
        "blobType": "BlockBlob",
        "url": "https://egblobstore.blob.core.windows.net/{containername}/blobname.jpg",
        "sequencer": "000000000000272D000000000003D60F",
        "storageDiagnostics": {
          "batchId": "{guid}"
        }
      },
      "dataVersion": "",
      "metadataVersion": "1"
    }]
    

    【讨论】:

    • 谢谢@josh E。这个函数触发了一个逻辑应用程序,因为我只使用一个容器,所以我还没有调查 EventGrid。我会在 2.0 版中做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2015-04-04
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多