如何从Azure函数返回流?

如何从Azure函数返回流?,azure,.net-core,stream,azure-functions,azure-durable-functions,Azure,.net Core,Stream,Azure Functions,Azure Durable Functions,我正在尝试使用dotnetcore编写Azure函数v2,作为持久函数的一部分。我想创建一个activity函数,它从blob存储中读取一个文件,对其进行解密并返回解密后的字节流。我可以创建解密流ok,并尝试如下返回流: [FunctionName("Decrypt")] public static async Task<IActionResult> Run( [ActivityTrigger] string blobName, ILogger log, Ex

我正在尝试使用dotnetcore编写Azure函数v2,作为持久函数的一部分。我想创建一个activity函数,它从blob存储中读取一个文件,对其进行解密并返回解密后的字节流。我可以创建解密流ok,并尝试如下返回流:

[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);
[函数名(“解密”)]
公共静态异步任务运行(
[ActivityTrigger]字符串blobName,
伊洛格日志,
ExecutionContext(上下文)
{
//从blob存储中获取流
var bytes=等待GetDecryptedByteArrayAsync(blobStream);
返回新的FileContentResult(字节,“应用程序/八位字节流”);
}
这似乎是可行的,但当我试着这样读响应时:

[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);
var provisiongarchive=wait
ctx.CallActivityAsync(“解密”,encryptedBlobName);
我得到以下例外情况:

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


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

是否应返回新的FileStreamResult

如果您使用JSON.NET,它具有以下功能。。。

我认为不可能将
返回到编排上下文,正如所述,返回值必须可序列化为JSON:

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

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

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

然后把它还给我。因为它可以序列化为Json,所以我可以来回传递它并在activity函数中重新创建流。

谢谢,我已经尝试过了,但是我遇到了另一个异常:Microsoft.Azure.WebJobs.Host:在函数返回后处理参数$return时出错:。Json:从'System.IO.MemoryStream'上的'ReadTimeout'获取值时出错。System.Private.CoreLib:此流不支持超时。ugh。。是的,您必须编写一个自定义转换器来完成将字节流转换为对象。也许我最好将流写入存储队列并从下一个活动函数中读取,这很遗憾,因为直接将流传递到编排上下文会很好。您是否尝试过更新所有NUGET?