c# - 使用 VS2017 在 Azure Function 中复制 Blob

标签 c# azure azure-functions

我在 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);
    }

但是现在该函数没有被事件调用,因此绑定(bind)出现了问题。我有什么明显做错的事情吗?我发现很难找到使用新 Function 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);
    }

这看起来可行吗(当我让输出工作时)?

谢谢

最佳答案

你的第二个例子在我这边效果很好。这是在我的函数应用程序中生成的函数 JSON。对于 blob 绑定(bind),方向为“out”。

{
  "bindings": [
    {
      "type": "blobTrigger",
      "path": "tobescanned/{name}",
      "direction": "in",
      "name": "myBlob"
    },
    {
      "type": "blob",
      "path": "employees/{name}",
      "direction": "out",
      "name": "outputBlob"
    }
  ],
  "disabled": false
}

您的第三个示例无法工作,因为触发函数时必须给出输入参数 {outputContainer}。根据您的要求,我建议您使用Azure Storage 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);
}

关于c# - 使用 VS2017 在 Azure Function 中复制 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45883311/

相关文章:

c# - 如何将 json 数据合并到数组中,但在几分钟内聚合数据?

azure-functions - 适用于长时间运行事件的 Azure 耐用功能

c# - ASP.NET 中的控件/变量命名约定

c# - 使用 DefaultDisplayPropertySet 从 C# 进行 PowerShell 输出格式化

c# - 将 ssl 添加到 webapi...也添加到客户端?

azure - 在 Azure 数据工厂中使用服务主体/应用程序进行 OAuth2 身份验证

c# - 从窗口获取线程ID

c# - 存储库模式只能与 Entity Framework 一起使用吗?

python - 获取我的 Azure 订阅中每天每个资源的成本

c# - Azure函数输出API调用第三方服务