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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:34:51