Soy nuevo en las funciones de Azure Durable y he estado siguiendo el código de muestra en el libro "Libro de recetas de computación sin servidor de Azure" y estoy atascado porque la función .GetInput en mi orquestador devuelve un valor nulo. Mi activador Blob pasa el nombre del archivo como un parámetro en la llamada a mi orquestador. Creo que está llamando a la función sobrecargada incorrecta, pero no estoy seguro de cómo llamar a la correcta.
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"); }De antemano, gracias por su ayuda.
Está llamando a la sobrecarga no genérica de StartAsync(string, string) donde el segundo argumento de string representa el InstanceId y no el argumento de entrada. También hay una sobrecarga genérica donde el segundo argumento representa los datos. Está pasando una string , por lo que la resolución de sobrecarga ve dos posibles candidatos. Luego prefiere el no genérico ya que es una coincidencia exacta , por lo que "pierde" sus datos.
Si realmente necesita una string para sus datos de entrada, deberá especificar el argumento genérico explícitamente para obligar al compilador a seleccionar la sobrecarga correcta:
await starter.StartAsync<string>("CSVImport_Orchestrator", name); Ahora, la documentación también establece que la entrada debe ser un objeto JSON serializable. Técnicamente, una string lo es, pero no estoy seguro de cómo funciona con el serializador del orquestador. En su lugar, puede pasar una clase que contenga sus datos. Esto tiene la ventaja de que el argumento genérico se inferirá correctamente:
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;