C# e funzioni di Azure: la funzione non è riconosciuta
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
Non è possibile chiamare direttamente una funzione tramite il suo FunctionName
attributo 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 log
manualmente - nell'esempio del progetto di orchestrazione di funzioni durevoli , log
viene iniettato tramite il context.CallActivityAsync
metodo.