我在Visual Studio 2017中使用最新的Azure Function SDK,我想将blob从一个容器复制到另一个容器。名称保持不变,但将从源blob的元数据中检索容器名称。
我刚刚尝试触发该功能并将元数据包含在:
[FunctionName("ScanFile")]
public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name, TraceWriter log)
{
log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
log.Info($"metadata count {metadata.Count}");
}
这样可行,所以然后尝试将副本复制为:
[FunctionName("ScanFile")]
public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name,
[Blob("employees/{name}", Connection = "AzureWebJobsStorage")]Stream outputBlob,
TraceWriter log)
{
log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
log.Info($"metadata count {metadata.Count}");
myBlob.CopyTo(outputBlob);
}
但是现在函数不是被调用的事件,所以绑定做错了。有什么明显我做错了吗?我发现很难找到使用新功能SDK的例子。
下一步(当我使用它时)是在运行时设置输出容器。我认为它可能是这样的:
[FunctionName("ScanFile")]
public static void Run([BlobTrigger("tobescanned/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, IDictionary<string, string> metadata, string name,
[Blob("{outputContainer}/{name}", Connection = "AzureWebJobsStorage")]Stream outputBlob, string outputContainer,
TraceWriter log)
{
log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
log.Info($"metadata count {metadata.Count}");
outputContainer = metadata["Destination"];
myBlob.CopyTo(outputBlob);
}
看起来它会起作用吗(当我输出工作时)?
由于
答案 0 :(得分:1)
你的第二个例子对我很好。这是我的功能应用程序中生成的函数JSON。 blob绑定的方向是'out'。
{
"bindings": [
{
"type": "blobTrigger",
"path": "tobescanned/{name}",
"direction": "in",
"name": "myBlob"
},
{
"type": "blob",
"path": "employees/{name}",
"direction": "out",
"name": "outputBlob"
}
],
"disabled": false
}
您的第三个示例无法工作,因为必须在触发函数时给出输入参数{outputContainer}。根据您的要求,我建议您使用Azure存储Blob SDK完成复制操作。以下代码供您参考。
[FunctionName("ScanFile")]
public static void Run([BlobTrigger("tobescanned/{name}")]CloudBlockBlob myBlob, string name,
IDictionary<string, string> metadata)
{
var destinationContainer = myBlob.Container.ServiceClient.GetContainerReference(metadata["Destination"]);
destinationContainer.CreateIfNotExists();
CloudBlockBlob outputBlob = destinationContainer.GetBlockBlobReference(name);
outputBlob.StartCopy(myBlob);
}