Durable Functions: 如何将参数传递给Orchestrator?

14

我刚开始接触Azure Durable函数,并且一直在按照《Azure 无服务器计算食谱》中的示例代码进行操作。但是,我的Orchestrator中的.GetInput函数返回了null,导致程序卡住。我的Blob触发器将文件名作为参数传递给我的Orchestrator。我认为它调用了错误的重载函数,但不确定如何调用正确的函数。

await starter.StartNewAsync("CSVImport_Orchestrator", name); 
        [FunctionName("CSVImport_Orchestrator")]
        public static async Task<List<string>> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            var outputs = new List<string>();
            string CSVFileName = context.GetInput<string>(); //<<== returns null???
            {
                List<Employee> employees = await context.CallActivityAsync<List<Employee>>("ReadCSV_AT", CSVFileName);
            }
            return outputs;
        }

        [FunctionName("CSVImportBlobTrigger")]
        public static async  void Run([BlobTrigger("import-obiee-report/{name}", Connection = "StorageConnection")]Stream myBlob, string name, [DurableClient]IDurableOrchestrationClient starter, ILogger log)
        {
            string instanceId = await starter.StartNewAsync("CSVImport_Orchestrator", name); 
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        }

提前感谢您的帮助。

1个回答

18
您正在调用非泛型重载的StartAsync(string, string),其中第二个string参数表示InstanceId而不是输入参数。还有一个泛型重载,其中第二个参数表示数据。您正在传递一个string,因此重载决策看到两个潜在的候选项。然后它更喜欢非泛型的,因为它是一个确切的匹配,从而“丢失”了您的数据。

如果您真的需要一个string作为输入数据,则需要明确指定泛型参数以强制编译器选择正确的重载:

await starter.StartAsync<string>("CSVImport_Orchestrator", name);

现在,文档还指出输入应该是可JSON序列化的对象。从技术上讲,string是可以的,但我不确定它与编排程序的序列化器如何配合。您可以传递一个包含数据的类。这样做的好处是泛型参数将被正确地推断
public class Data {
   public string Name { get; set; } 
} 

// calling 
await starter.StartAsync("CSVImport_Orchestrator", new Data { Name = name });

// using 
var csvFileName = context.GetInput<Data>()?.Name;

我喜欢你的课程想法。你能解释一下“public record Data(string Name)”吗?(它没有编译通过。) - PKonstant
这是一个名为records的c#9特性。该行声明了一个具有单个公共属性“Name”的类。但是,当我回复您时,我意识到Azure函数无法在net5上运行,即使您使用最新的编译器也不支持新功能。我已更新示例以使用完整的类。对此感到抱歉。 - pinkfloydx33
1
使用您的类的想法起作用了!非常感谢! - PKonstant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接