C# et Azure Functions - La fonction n'est pas reconnue

Aug 20 2020

J'ai écrit une fonction durable qui fonctionne très bien pour gérer les données JSON entrantes et les mettre dans une file d'attente pour le traitement. (Le stockage Table fonctionne également.) Mon problème concerne la fonction Azure qui gère le déclencheur de file d'attente, où l'une de mes fonctions n'est pas reconnue. Mon code complet est actuellement de 200 lignes donc voici un exemple trop simplifié :

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

Là où j'essaie de faire le await, ça me dit que The name 'DoSomething' does not exist in the current context.je ne comprends pas - c'est dans la même classe et le même espace de noms, et cela fonctionne bien dans mon projet d'orchestration de fonctions durables. Cependant, je note que dans mon projet d'orchestration des fonctions durables, les fonctions durables ont un contexte, comme ceci :

[OrchestrationTrigger] IDurableOrchestrationContext context,

Et puis nous utilisons le contexte pour faire un travail asynchrone comme :

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

AddSomeDataest défini comme :

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

Il ne semble pas y avoir de contexte pour QueueTrigger de la même manière que pour l'orchestration de fonctions durables. Qu'est-ce que je rate?

(Je suis un programmeur VB.NET WinForms en transition vers les fonctions Azure avec C#.)

Réponses

2 CoolBots Aug 20 2020 at 04:21

Vous ne pouvez pas appeler directement une fonction par son FunctionNameattribut Azure Functions.

Dans votre exemple de projet d'orchestration de fonctions durables , vous n'appelez pas la fonction directement, mais via un mécanisme fourni par le framework :

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

Aviez-vous essayé ce qui suit :

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

ou même:

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

Vous vous retrouveriez avec la même erreur exacte, à moins que le nom de la fonction réelle ne soit également AddSomeData(dans votre cas, c'est Run- donc vous obtiendrez l'erreur).

Ainsi, à la place, vous pouvez utiliser le nom réel de la fonction :

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

Notez que vous devez passer le logmanuellement - dans l' exemple de projet d'orchestration des fonctions durableslog , le est injecté via la context.CallActivityAsyncméthode .