Функции C # и Azure - функция не распознается

Aug 20 2020

Я написал надежную функцию, которая отлично справляется с обработкой входящих данных JSON и помещает их в очередь для обработки. (У меня тоже работает табличное хранилище.) Моя проблема связана с функцией Azure, которая обрабатывает триггер очереди, где одна из моих функций не распознается. Мой полный код в настоящее время состоит из 200 строк, поэтому вот упрощенный пример:

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

Когда я пытаюсь сделать это await, он говорит мне, что The name 'DoSomething' does not exist in the current context.я не понимаю - он находится в том же классе и пространстве имен, и это отлично работает в моем проекте надежной оркестровки функций. Тем не менее, я отмечу, что в моем проекте оркестровки устойчивых функций у устойчивых функций есть контекст, например:

[OrchestrationTrigger] IDurableOrchestrationContext context,

Затем мы используем контекст для выполнения асинхронной работы, например:

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

Где AddSomeDataопределяется как:

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

Похоже, что для QueueTrigger нет контекста, как для надежной оркестровки функций. Что мне не хватает?

(Я программист VB.NET WinForms, перехожу на функции Azure с C #.)

Ответы

2 CoolBots Aug 20 2020 at 04:21

Вы не можете напрямую вызвать функцию с помощью ее FunctionNameатрибута функций Azure .

В вашем примере проекта надежной оркестровки функций вы вызываете функцию не напрямую, а через механизм, предоставляемый фреймворком:

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

Если бы вы пробовали следующее:

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

или даже:

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

Вы получите ту же самую ошибку, если только фактическое имя функции не окажется AddSomeData(в вашем случае это Run- так что вы получите ошибку).

Итак, вместо этого вы можете использовать фактическое имя функции:

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

Обратите внимание, что вам нужно передать logфайл вручную - в примере проекта оркестрации устойчивых функций , logон вводится через context.CallActivityAsyncметод.