我正在尝试使用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的构造函数
如何将其反序列化为表示流的对象?
答案 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)
您应该返回一个新的FileStreamResult吗?
如果使用JSON.NET,它具有此功能... https://www.newtonsoft.com/json/help/html/DeserializeWithJsonSerializerFromFile.htm