C# und Azure Functions – Funktion wird nicht erkannt
Ich habe eine dauerhafte Funktion geschrieben, die hervorragend funktioniert, um eingehende JSON-Daten zu verarbeiten und sie zur Verarbeitung in eine Warteschlange zu stellen. (Ich habe auch den Tabellenspeicher zum Laufen gebracht.) Mein Problem liegt bei der Azure-Funktion, die den Warteschlangenauslöser verarbeitet, bei der eine meiner Funktionen nicht erkannt wird. Mein vollständiger Code umfasst derzeit 200 Zeilen. Hier ist ein stark vereinfachtes Beispiel:
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;
}
}
}
Wo ich versuche, das zu tun await, sagt es mir, dass The name 'DoSomething' does not exist in the current context.ich es nicht verstehe - es befindet sich in derselben Klasse und demselben Namespace, und dies funktioniert gut in meinem Orchestrierungsprojekt für dauerhafte Funktionen. Ich stelle jedoch fest, dass in meinem Orchestrierungsprojekt für dauerhafte Funktionen dauerhafte Funktionen einen Kontext wie diesen haben:
[OrchestrationTrigger] IDurableOrchestrationContext context,
Und dann verwenden wir den Kontext, um asynchrone Arbeiten auszuführen wie:
string res = await context.CallActivityAsync<string>("AddSomeData", data);
Wo AddSomeDataist definiert wie:
[FunctionName("AddSomeData")]
public static async Task<Strin> Run(string data, ILogger log)
{
// do work
return "OK";
}
Es scheint keinen ähnlichen Kontext für QueueTrigger zu geben wie für die dauerhafte Funktionsorchestrierung. Was vermisse ich?
(Ich bin ein VB.NET-WinForms-Programmierer, der mit C# zu Azure-Funktionen wechselt.)
Antworten
Sie können eine Funktion nicht direkt über ihr Azure Functions- FunctionNameAttribut aufrufen.
In Ihrem Projektbeispiel zur Orchestrierung dauerhafter Funktionen rufen Sie die Funktion nicht direkt auf, sondern über einen vom Framework bereitgestellten Mechanismus:
string res = await context.CallActivityAsync<string>("AddSomeData", data);
Hättest du folgendes versucht:
string res = await AddSomeData(data); // no such function!
oder auch:
string res = await AddSomeData(data, log); // still no such function!
Sie würden mit genau demselben Fehler enden, es sei denn, der tatsächliche Funktionsname ist zufällig auch AddSomeData(in Ihrem Fall ist es Run- also würden Sie den Fehler bekommen).
Stattdessen können Sie den tatsächlichen Namen der Funktion verwenden:
[FunctionName("Main")]
public static async void Run([QueueTrigger("queue", Connection = "myinfo_STORAGE")] MyItem Item, ILogger log)
{
await Run("Information", log);
}
Beachten Sie, dass Sie das logmanuell übergeben müssen – im Projektbeispiel für die Orchestrierung von dauerhaften Funktionen wird das über die Methode loginjiziert .context.CallActivityAsync