Azure Durable Function短元组传参为空,普通Tuple正常的问题咨询
短元组无法向Azure Durable Orchestrator传递参数的问题
问题场景
在HttpTrigger函数中使用无命名短元组传递参数给Azure Durable Orchestrator时,参数始终为null:
发送端代码:
var param1 = Guid.NewGuid().ToString(); var param2 = Guid.NewGuid().ToString(); string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(Function1), (param1, param2));
Orchestrator接收代码:
var (param1, param2) = context.GetInput<(string, string)>();
改用Tuple.Create的方式则能正常传递:
发送端代码:
var param1 = Guid.NewGuid().ToString(); var param2 = Guid.NewGuid().ToString(); string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(Function1), Tuple.Create(param1, param2));
Orchestrator接收代码:
var (param1, param2) = context.GetInput<Tuple<string, string>>();
环境信息:
Env: Target framework: net8.0 AzureFunctionsVersion v4 Mode: Isolated mode Core Tools Version: 4.0.5455 Commit hash: N/A (64-bit) Function Runtime Version: 4.27.5.21554
原因分析
在.NET Isolated模式下,Durable Functions使用System.Text.Json进行参数的序列化与反序列化:
- 无命名短元组(
(string, string))属于ValueTuple类型,默认序列化后会生成{"Item1":"xxx","Item2":"xxx"}格式的JSON,但反序列化时,System.Text.Json无法将这些Item1/Item2字段自动映射到无命名ValueTuple的位置参数,导致值为null。 - 而
Tuple<string, string>是引用类型,其本身的属性就是Item1和Item2,序列化与反序列化的字段名完全匹配,因此可以正常解析。
解决方案
方案1:使用命名元组
给短元组指定字段名称,让序列化后的JSON字段名与反序列化的元组命名对应:
发送端代码:
var param1 = Guid.NewGuid().ToString(); var param2 = Guid.NewGuid().ToString(); // 使用命名元组传递参数 string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(Function1), (Param1: param1, Param2: param2));
Orchestrator接收代码:
// 匹配命名元组的字段名称 var (param1, param2) = context.GetInput<(string Param1, string Param2)>();
方案2:使用自定义实体类(推荐)
创建专门的参数类,提升代码可读性与可维护性:
定义参数类:
public class OrchestrationParameters { public string Param1 { get; set; } public string Param2 { get; set; } }
发送端代码:
var instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(Function1), new OrchestrationParameters { Param1 = Guid.NewGuid().ToString(), Param2 = Guid.NewGuid().ToString() });
Orchestrator接收代码:
var parameters = context.GetInput<OrchestrationParameters>(); string param1 = parameters.Param1; string param2 = parameters.Param2;
内容的提问来源于stack exchange,提问作者smolesen
相关产品推荐
相关产品推荐

