C# e funzioni di Azure: la funzione non è riconosciuta

Aug 20 2020

Ho scritto una funzione durevole che funziona alla grande per gestire i dati JSON in arrivo e metterli in coda per l'elaborazione. (Ho anche funzionato l'archiviazione tabelle.) Il mio problema è con la funzione di Azure che gestisce il trigger della coda, in cui una delle mie funzioni non viene riconosciuta. Il mio codice completo è attualmente di 200 righe, quindi ecco un esempio troppo semplificato:

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;
        }       
    }
}   

Dove provo a fare il await, mi sta dicendo The name 'DoSomething' does not exist in the current context.che non capisco - è nella stessa classe e nello stesso spazio dei nomi, e questo funziona bene nel mio progetto di orchestrazione di funzioni durevoli. Tuttavia, noto che nel mio progetto di orchestrazione di funzioni durevoli, le funzioni durevoli hanno un contesto, in questo modo:

[OrchestrationTrigger] IDurableOrchestrationContext context,

E poi usiamo il contesto per fare un lavoro asincrono come:

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

Dove AddSomeDataè definito come:

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

Non sembra esserci un contesto per QueueTrigger nello stesso modo in cui esiste per l'orchestrazione di funzioni durevoli. Cosa mi manca?

(Sono un programmatore VB.NET WinForms che passa alle funzioni di Azure con C#.)

Risposte

2 CoolBots Aug 20 2020 at 04:21

Non è possibile chiamare direttamente una funzione tramite il suo FunctionNameattributo Funzioni di Azure.

Nel tuo esempio di progetto di orchestrazione di funzioni durevoli , non stai chiamando la funzione direttamente, ma tramite un meccanismo fornito dal framework:

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

Hai provato quanto segue:

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

o anche:

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

Finiresti con lo stesso errore esatto, a meno che non sia anche il nome effettivo della funzioneAddSomeData (nel tuo caso, è Run- quindi otterresti l'errore).

Quindi, invece, puoi usare il nome effettivo della funzione:

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

Nota che devi passare logmanualmente - nell'esempio del progetto di orchestrazione di funzioni durevoli , logviene iniettato tramite il context.CallActivityAsyncmetodo.