2

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

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

4

2 回答 2

5

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

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

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

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

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

于 2019-01-16T10:20:21.630 回答
1

你应该返回一个新的 FileStreamResult 吗?

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.filestreamresult.-ctor?view=aspnetcore-2.2

如果你使用 JSON.NET 它有这个能力...... https://www.newtonsoft.com/json/help/html/DeserializeWithJsonSerializerFromFile.htm

于 2019-01-15T16:56:32.487 回答