You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Durable Orchestrator传递多Zip文件失败问题排查

问题根源

Durable Orchestrator的输入必须是可JSON序列化的类型,而MultipartMemoryStreamProvider本身包含不可序列化的流对象和复杂HTTP上下文信息,直接传递会导致序列化丢失关键数据(比如文件内容流),仅能保留文件名这类简单字符串属性。

解决方案

需要在HTTP触发器中先解析文件,将其转换为可序列化的POCO对象,再传递给Orchestrator。具体步骤如下:

1. 定义可序列化的文件模型

创建一个包含文件名和文件内容字节数组的类:

public class UploadedFile
{
    public string FileName { get; set; }
    public byte[] Content { get; set; }
}

2. 修改HTTP触发器代码

解析MultipartMemoryStreamProvider,将每个文件转换为UploadedFile实例后传递给Orchestrator:

// 异步读取多部分表单数据(避免用.Result导致死锁)
var provider = await req.Content.ReadAsMultipartAsync();
var uploadedFiles = new List<UploadedFile>();

foreach (var content in provider.Contents)
{
    // 提取文件名(去除前后引号)
    var fileName = content.Headers.ContentDisposition.FileName.Trim('"');
    // 将文件内容读取为字节数组(可序列化)
    var fileContent = await content.ReadAsByteArrayAsync();
    
    uploadedFiles.Add(new UploadedFile { FileName = fileName, Content = fileContent });
}

// 传递可序列化的文件列表给Orchestrator
string instanceId = await starter.StartNewAsync("ParentOrchestrator", uploadedFiles);

3. 修改Orchestrator代码

接收UploadedFile列表,将字节数组转换为内存流处理Zip文件:

public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context
)
{
    var uploadedFiles = context.GetInput<List<UploadedFile>>();
    var processingResults = new List<string>();

    foreach (var file in uploadedFiles)
    {
        // 将字节数组转为内存流,用于操作Zip文件
        using (var zipStream = new MemoryStream(file.Content))
        {
            // 这里编写你的Zip文件处理逻辑(比如解压、读取内部文件等)
            // 示例:记录处理完成的文件名
            processingResults.Add($"已处理文件: {file.FileName}");
        }
    }

    return processingResults;
}
大文件场景优化

如果Zip文件体积较大(超过几百MB),直接传递字节数组会占用过多内存,此时建议:

  • 在HTTP触发器中先将文件上传到Azure Blob存储
  • 传递Blob的URI给Orchestrator
  • 通过Activity Function读取Blob并处理(Orchestrator应避免直接处理大内存对象或IO操作)

内容的提问来源于stack exchange,提问作者Pavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:10:36