【问题标题】:How to return a stream from an Azure Function?如何从 Azure 函数返回流?
【发布时间】:2019-01-16 18:20:21
【问题描述】:

我正在尝试使用 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 标记的构造函数

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

【问题讨论】:

  • 你试过更新所有的 nuget 吗?

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


【解决方案1】:

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

返回值 - 返回值被序列化为 JSON 并保存在 Azure 表存储中的业务流程历史记录表中。这些返回值可以通过编排客户端绑定查询,后面会介绍。

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

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

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢,我试过了,但我得到了一个不同的异常:Microsoft.Azure.WebJobs.Host: Error while handling parameter $return after function returned:. Newtonsoft.Json:从“System.IO.MemoryStream”上的“ReadTimeout”获取值时出错。 System.Private.CoreLib:此流不支持超时。
    • ugh.. 是的,您将不得不编写一个自定义转换器来完成将该字节流转换为对象。 stackoverflow.com/questions/30331027/…
    • 也许我会更好地将流写入存储队列并从下一个活动函数中读取,这很遗憾,因为直接通过编排上下文传递流会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多