C#およびAzure関数-関数が認識されない

Aug 20 2020

着信JSONデータを処理し、処理のためにキューに入れるのに最適な耐久性のある関数を作成しました。(テーブルストレージも機能しました。)私の問題は、キュートリガーを処理するAzure関数にあり、関数の1つが認識されていません。私の完全なコードは現在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プログラマーであり、C#を使用してAzure関数に移行しています。)

回答

2 CoolBots Aug 20 2020 at 04:21

AzureFunctionsFunctionName属性で関数を直接呼び出すことはできません。

あなたには耐久性のある機能のオーケストレーションプロジェクトの例として、あなたがたが、フレームワークが提供する機構を介して、直接関数を呼び出していません。

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手動で渡す必要があることに注意してください。永続関数オーケストレーションプロジェクトの例ではlogcontext.CallActivityAsyncメソッドを介して注入されます。