Fungsi C # dan Azure - Fungsi tidak dikenali

Aug 20 2020

Saya menulis fungsi tahan lama yang berfungsi sangat baik untuk menangani data JSON yang masuk dan memasukkannya ke dalam antrian untuk diproses. (Saya mendapatkan penyimpanan Tabel juga berfungsi.) Masalah saya adalah dengan fungsi Azure yang menangani pemicu antrian, di mana salah satu fungsi saya tidak dikenali. Kode lengkap saya saat ini 200 baris, jadi inilah contoh yang terlalu disederhanakan:

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

Di mana saya mencoba melakukan await, itu memberi tahu saya bahwa saya The name 'DoSomething' does not exist in the current context.tidak mengerti - itu berada di kelas & namespace yang sama, dan ini berfungsi dengan baik dalam proyek orkestrasi fungsi tahan lama saya. Namun, saya perhatikan bahwa dalam proyek orkestrasi fungsi tahan lama saya, fungsi tahan lama memiliki konteks, seperti:

[OrchestrationTrigger] IDurableOrchestrationContext context,

Dan kemudian kami menggunakan konteks untuk melakukan pekerjaan asinkron seperti:

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

Dimana AddSomeDatadiartikan seperti:

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

Tampaknya tidak ada konteks untuk QueueTrigger dengan cara yang sama seperti untuk orkestrasi fungsi yang tahan lama. Apa yang saya lewatkan?

(Saya seorang programmer VB.NET WinForms yang bertransisi ke fungsi Azure dengan C #.)

Jawaban

2 CoolBots Aug 20 2020 at 04:21

Anda tidak bisa langsung memanggil fungsi dengan FunctionNameatribut Azure Functions-nya .

Dalam contoh proyek orkestrasi fungsi tahan lama , Anda tidak memanggil fungsi secara langsung, tetapi melalui mekanisme yang disediakan oleh framework:

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

Apakah Anda sudah mencoba yang berikut ini:

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

atau bahkan:

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

Anda akan berakhir dengan kesalahan yang sama persis, kecuali nama fungsi sebenarnya juga ada AddSomeData(dalam kasus Anda, ini Run- jadi Anda akan mendapatkan kesalahan).

Jadi, sebagai gantinya, Anda dapat menggunakan nama sebenarnya dari fungsi tersebut:

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

Perhatikan bahwa Anda harus meneruskan logsecara manual - dalam contoh proyek orkestrasi fungsi tahan lama , yang logdimasukkan melalui context.CallActivityAsyncmetode.