如何从 Azure 函数返回流?

Aid*_*dan 2 stream azure .net-core azure-functions azure-durable-functions

我正在尝试使用 dotnet core 作为持久函数的一部分编写 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");
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但是当我尝试阅读这样的回复时:

        var provisioningArchive = await
            ctx.CallActivityAsync<FileContentResult>("Decrypt", encryptedBlobName);
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

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

我怎样才能让它反序列化成一个代表流的对象?

Aid*_*dan 5

我认为不可能将 a 返回Stream到 Orchestration 上下文,因为Bindings 文档说返回值必须可序列化为 JSON:

返回值 - 返回值被序列化为 JSON 并持久保存到 Azure 表存储中的业务流程历史记录表。这些返回值可以通过编排客户端绑定进行查询,稍后描述。

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

public class StreamDto
{
    public string Name { get; set; }
    public byte[] Contents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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