我有一个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
值,但是我不知道该怎么做。
任何人都可以阐明我需要做什么以及可能如何做吗?
答案 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