ประเภทใดบ้างที่คุณสามารถส่งผ่านเป็นพารามิเตอร์ไปยังแอป C # Azure Function สำหรับผู้ดูแลระบบเท่านั้น

Jan 11 2021

ประเภทใดบ้างที่อนุญาตให้เป็นพารามิเตอร์สำหรับแอปฟังก์ชัน Azure ที่เขียนด้วย C # ซึ่งสามารถเรียกใช้ได้ผ่านปลายทางของผู้ดูแลระบบเท่านั้น

ฉันได้อ่านเอกสารประกอบและซอร์สโค้ดมากมายและยังไม่ทราบคำตอบ ฉันกำลังมองหาการอ้างอิงที่ชัดเจนและคำอธิบายที่ชัดเจนเกี่ยวกับความหมายและเหตุผลรวมถึงตัวอย่างวิธีการใช้ฟังก์ชันกับพารามิเตอร์ประเภทอื่น ๆ

ฉันสงสัยว่าทีม Azure คาดหวังให้คุณยอมรับสตริงของ JSON และแยกวิเคราะห์ด้วยตัวเองเป็นประเภทที่เหมาะสมหรือไม่ แต่เอกสารที่ฉันพบไม่ได้ระบุไว้

บริบทเพิ่มเติม

ฟังก์ชันเฉพาะที่ฉันกำลังทำงานอยู่นั้นจะถูกเรียกผ่านทางอินเทอร์เฟซผู้ดูแลระบบเท่านั้นดังนั้นจึงไม่มีการผูก Http และอื่น ๆ

[NoAutomaticTrigger]
[FunctionName(nameof(SomeFunctionName))]
public async Task SomeFunctionName(ParameterTypeHere someParameterName)
{
...

ฉันจะใส่อะไรแทนได้ParameterTypeHereบ้าง?

การใช้งานเฉพาะที่ฉันมี (ในครั้งนี้) คือฉันต้องการส่งผ่านบางอย่างเช่นList<Guid>หรือGuid[]ฉันไม่รังเกียจถ้าฉันต้องห่อมันในชั้นเรียนหรือบางอย่าง แต่ฉันไม่ได้พยายามอะไรเลยฉันจึงได้แยกสตริงออก ลูกน้ำและแยกคำแนะนำซึ่งดูเหมือนเป็นวิธีแก้ปัญหาที่ไม่ดี

ขณะนี้ฉันมีพารามิเตอร์สตริงและกำลังเรียกใช้ด้วย:

$ curl -v http://localhost:7071/admin/functions/SomeFunctionName \
  -d '{"input": "699F3073-9BFD-4DA7-9E61-4E6564D032EC,197DA362-C281-4E0F-BB92-8759F7A5B4B4"}' \
  -H "Content-Type:application/json"

การวิจัยจนถึงขณะนี้

สิ่งที่ฉันได้ดูไปแล้วทำให้ฉันยังไม่แน่ใจว่าฉันสามารถใช้อะไรได้บ้างstringสำหรับอินพุตที่ซับซ้อนมากขึ้น:

  • ฟังก์ชัน Azure: ประเภททั่วไปเป็นพารามิเตอร์อินพุต
    • https://github.com/Azure/Azure-Functions/issues/735
  • ข้อผิดพลาดของฟังก์ชัน Azure - ไม่สามารถผูกพารามิเตอร์เพื่อพิมพ์ String
  • ไม่สามารถผูกพารามิเตอร์ทำให้ชนิดพารามิเตอร์ไม่ได้รับการสนับสนุนโดยการโยง (HttpTrigger ของฟังก์ชัน Azure)
  • ไม่สามารถผูก ILogger ในฟังก์ชัน azure v1
  • https://docs.microsoft.com/en-us/azure/azure-functions/functions-manually-run-non-http
  • https://github.com/Azure/azure-functions-host/blob/dev/src/WebJobs.Script/Binding/Manual/ManualTriggerAttributeBindingProvider.cs#L39
    • https://github.com/Azure/azure-functions-host/blob/9b2fa0f3ea69c41ce819f046213eab4f40a5db5f/src/WebJobs.Script/Binding/StreamValueBinder.cs#L24-L30
    • https://github.com/Azure/azure-functions-host/blob/9b2fa0f3ea69c41ce819f046213eab4f40a5db5f/src/WebJobs.Script/Utility.cs#L245
  • ServiceBusTrigger พร้อมอาร์กิวเมนต์ enqueueTimeUtc ล้มเหลวเมื่อทริกเกอร์ผ่าน HTTP endpoint

ชื่อพารามิเตอร์จะถูกละเว้นและคุณต้องส่งด้วยชื่อ " input" โดยไม่คำนึงถึงชื่อพารามิเตอร์จริง อีกสิ่งหนึ่งที่จะเดินทางไป

บริบทมากยิ่งขึ้น

หากคุณสงสัยว่าทำไมคุณถึงต้องการฟังก์ชั่นเฉพาะผู้ดูแลระบบนี่เป็นงานที่ดำเนินการครั้งเดียวโดยบุคคลอื่นที่สามารถเข้าถึงปลายทางของผู้ดูแลระบบได้ ดูเหมือนจะเป็นสิ่งที่ง่ายที่สุดที่สามารถทำงานได้ HttpTriggerจะได้รับการปรับมันก็ดูเหมือนจะละเมิด YAGNI

คำตอบ

2 RoarS. Jan 11 2021 at 22:56

เมื่อหลายสัปดาห์ก่อนฉันได้ทดสอบวิธีการแปลง API โดยใช้ฟังก์ชันที่ให้ความสนใจเป็นพิเศษกับ DI (ไม่แสดงในตัวอย่างด้านล่าง) และการตรวจสอบความถูกต้อง นี่อาจไม่ใช่คำตอบโดยตรงสำหรับคำถามของคุณ แต่แสดงให้เห็นว่าอาจใช้คลาสโมเดลธรรมดาได้

public class MyRequestModel
{
    [Display(Name = "Message")]
    [Required, MinLength(3)]
    public string Message { get; set; }
}

public static class MyHttpExample
{
    [FunctionName(nameof(MyHttpExample))]
    public static IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = "test/{message}")] MyRequestModel req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        var validationResults = new List<ValidationResult>();
        if (!Validator.TryValidateObject(req, new ValidationContext(req, null, null), validationResults, true))
        {
            return new BadRequestObjectResult(validationResults);
        }

        var responseMessage = $"Hello, {req.Message}. This HTTP triggered function executed successfully.";
        return new OkObjectResult(responseMessage);
    }
}

ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบนิพจน์การผูกฟังก์ชัน Azure https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

เมื่ออ่านเอกสารข้างต้นโปรดทราบว่าfunction.jsonสร้างขึ้นจากคำอธิบายประกอบเมื่อใช้ C # แต่ doc จะแสดงสิ่งที่พร้อมใช้งาน ฟังก์ชันที่สร้างขึ้น json สำหรับตัวอย่างข้างต้น:

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-3.0.11",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "httpTrigger",
      "route": "test",
      "methods": [
        "get"
      ],
      "authLevel": "function",
      "name": "req"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyFunctions.dll",
  "entryPoint": "MyFunctions.MyHttpExample.Run"
}

ดูสิ่งนี้ด้วย https://stackoverflow.com/a/54489040/14072498