【问题标题】:Deserialize blob and output to different container with a name from the blob's contents反序列化 blob 并使用 blob 内容中的名称输出到不同的容器
【发布时间】:2018-03-24 06:38:02
【问题描述】:

我在一个 azure blob 中有一个 json,我需要对其进行反序列化并从中获取一个字符串。该字符串是 blob 的名称。然后,我需要将作为此函数输入的 blob 使用我刚刚提取的名称复制到存储容器中。

public static void Run([BlobTrigger("output/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, TraceWriter log)
using (var sr = new StreamReader(myBlob))
using (var jsonTextReader = new JsonTextReader(sr))
{
    var transcript = (someobject)serializer.Deserialize(jsonTextReader, typeof(Transcript));
    string blobname = (someobject.Results[0].FileName).Substring(0, name.LastIndexOf('.'));

以上是我当前函数的定义以及我用来从 json.xml 中提取文件名的方法。这可能与 blob 输入和输出绑定有关吗?如果是这样,有没有办法动态分配输出 blob 的名称?

【问题讨论】:

    标签: c# azure visual-studio-2017 azure-functions azure-blob-storage


    【解决方案1】:

    您可以使用命令式绑定来编写输出 blob,内容符合:

    public static void Run(
        [BlobTrigger("input/{name}", Connection = "AzureWebJobsStorage")] string myBlob, 
        string name, 
        Binder binder)
    {
      var someobject= serializer.Deserialize<Transcript>(myBlob);
      string blobname = (someobject.Results[0].FileName).Substring(0, name.LastIndexOf('.'));
    
      using (var writer = binder.Bind<TextWriter>(
                  new BlobAttribute($"output/{blobname}")))
      {
          writer.Write(myBlob);
      }
    }
    

    我稍微改变了你的函数,以使我的示例更易于阅读。

    【讨论】:

    • 我遇到的问题是 Blob 被空上传到目标 Blob
    • @DarthVeder 你还在使用 Streams 吗?如果是这样,您可能会错误地复制流。
    • 是的,我正在使用流。
    • @DarthVeder 不要忘记在复制到输出之前将输入流重置为位置 0。或者重构为字符串:)
    • 当我尝试将流重置为 0 时不断收到此错误:对象引用未设置为对象的实例
    【解决方案2】:

    如果您配置 CloudBlockBlob 输出绑定,ContainerName 属性将是只读的,由 [Blob] 绑定属性定义。但是,有一种叫做“命令式绑定”的东西可以让您将绑定推迟到运行时,example 甚至演示了写入任意 blob 容器和文件名:

    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;
    
    public static async Task Run(string input, Binder binder)
    {
        using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
        {
            writer.Write("Hello World!!");
        }
    }
    

    对于预编译的应用程序,我个人认为“老式方式”更易于阅读,但我认为这是一个偏好问题。

    CloudStorageAccount storage = CloudStorageAccount.Parse(conn_str);
    CloudBlobClient blobClient = storage.CreateCloudBlobClient();
    CloudBlobContainer blobContainer = blobClient.GetContainerReference(container);
    CloudBlockBlob blob =blobContainer.GetBlockBlobReference(filename);
    // etc.
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2022-12-17
      • 2020-06-14
      • 2018-06-10
      • 2018-01-27
      • 2014-06-22
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多