ฟังก์ชัน 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,

จากนั้นเราใช้บริบทเพื่อทำงาน async เช่น:

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 Functions

ในตัวอย่างโปรเจ็กต์การจัดเตรียมฟังก์ชันที่ทนทานของคุณคุณไม่ได้เรียกใช้ฟังก์ชันโดยตรง แต่ใช้กลไกที่มาจากกรอบงาน:

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วิธีการ