如何从Azure函数返回流?

时间:2019-01-15 16:37:54

标签: azure .net-core stream azure-functions azure-durable-functions

我正在尝试使用dotnet核心作为持久功能的一部分来编写Azure Function v2。我想创建一个活动函数,该函数从Blob存储中读取文件,对其进行解密,然后返回解密的字节流。我可以创建解密的流,然后尝试返回该流:

[FunctionName("Decrypt")]
public static async Task<IActionResult> Run(
    [ActivityTrigger] string blobName,
    ILogger log,
    ExecutionContext context)
{
    // get stream from blob storage

    var bytes = await GetDecryptedByteArrayAsync(blobStream);
    return new FileContentResult(bytes, "application/octet-stream");
}

这似乎可行,但是当我尝试读取如下响应时:

        var provisioningArchive = await
            ctx.CallActivityAsync<FileContentResult>("Decrypt", encryptedBlobName);

我收到以下异常:

  

Newtonsoft.Json.JsonSerializationException:无法找到用于类型Microsoft.AspNetCore.Mvc.FileContentResult的构造函数。一个类应该具有一个默认构造函数,一个带有参数的构造函数或一个标有JsonConstructor的构造函数

如何将其反序列化为表示流的对象?

2 个答案:

答案 0 :(得分:2)

我认为不可能将Stream返回到业务流程上下文,因为Bindings documentation表示返回值必须可序列化为JSON:

  

返回值-返回值被序列化为JSON,并持久存储在Azure Table存储中的业务流程历史表中。这些返回值可以通过业务流程客户端绑定来查询,如下所述。

我通过创建一个Dto来包装原始字节数组来解决这个问题:

public class StreamDto
{
    public string Name { get; set; }
    public byte[] Contents { get; set; }
}

,然后返回。由于它可序列化为Json,因此我可以来回传递它并在activity函数中重新创建流。

答案 1 :(得分:0)