C# e Azure Functions - A função não é reconhecida

Aug 20 2020

Escrevi uma função durável que funciona muito bem para lidar com dados JSON recebidos e colocá-los em uma fila para processamento. (O armazenamento de tabelas também está funcionando.) Meu problema é com a função do Azure que lida com o gatilho da fila, onde uma das minhas funções não está sendo reconhecida. Meu código completo tem atualmente 200 linhas, então aqui está um exemplo muito simplificado:

namespace My.Namespace
{
    public static class Test
    {
        [FunctionName("Main")]
        public static async void Run([QueueTrigger("queue", Connection = "myinfo_STORAGE")] MyItem Item, ILogger log)
        {
            await DoSomethingElse("Information");
        }
        
        [FunctionName("DoSomething")]
        public static async Task Run(string msg, ILogger log)
        {
            // code to do something
            return;
        }       
    }
}   

Onde tento fazer o await, está me dizendo The name 'DoSomething' does not exist in the current context.que não entendo - está na mesma classe e namespace, e isso funciona bem em meu projeto de orquestração de funções duráveis. No entanto, observo que em meu projeto de orquestração de funções duráveis, as funções duráveis ​​têm um contexto, como:

[OrchestrationTrigger] IDurableOrchestrationContext context,

E então usamos o contexto para fazer um trabalho assíncrono como:

string res = await context.CallActivityAsync<string>("AddSomeData", data);

Onde AddSomeDataé definido como:

[FunctionName("AddSomeData")]
public static async Task<Strin> Run(string data, ILogger log)
{
    // do work
    return "OK";
}

Não parece haver um contexto para QueueTrigger da mesma forma que existe para a orquestração de funções duráveis. o que estou perdendo?

(Sou um programador VB.NET WinForms em transição para as funções do Azure com C#.)

Respostas

2 CoolBots Aug 20 2020 at 04:21

Você não pode chamar diretamente uma função por seu FunctionNameatributo Azure Functions.

Em seu exemplo de projeto de orquestração de funções duráveis , você não está chamando a função diretamente, mas por meio de um mecanismo fornecido pela estrutura:

string res = await context.CallActivityAsync<string>("AddSomeData", data);

Se você tentou o seguinte:

string res = await AddSomeData(data); // no such function!

ou ainda:

string res = await AddSomeData(data, log); // still no such function!

Você acabaria com o mesmo erro exato, a menos que o nome da função real também fosse AddSomeData(no seu caso, é Run- então você receberia o erro).

Então, em vez disso, você pode usar o nome real da função:

[FunctionName("Main")]
public static async void Run([QueueTrigger("queue", Connection = "myinfo_STORAGE")] MyItem Item, ILogger log)
{
   await Run("Information", log);
}

Observe que você deve passar logmanualmente - no exemplo de projeto de orquestração de funções duráveislog , o é injetado por meio do context.CallActivityAsyncmétodo.