Bạn có thể chuyển những loại nào dưới dạng tham số cho ứng dụng Hàm C # Azure chỉ dành cho quản trị viên?

Jan 11 2021

Những loại nào được phép làm tham số cho các ứng dụng Hàm Azure được viết bằng C # chỉ có thể gọi được thông qua điểm cuối quản trị?

Tôi đã đọc rất nhiều tài liệu và mã nguồn và tôi vẫn không biết câu trả lời. Tôi đang tìm kiếm các tài liệu tham khảo rõ ràng và giải thích rõ ràng về điều đó có nghĩa là gì và tại sao, cùng với các ví dụ về cách triển khai các hàm với các loại tham số khác.

Tôi tự hỏi liệu nhóm Azure có mong bạn chấp nhận một chuỗi JSON và tự phân tích nó thành các loại thích hợp hay không, nhưng tài liệu tôi tìm thấy không cho biết.

Bối cảnh bổ sung

Chức năng cụ thể mà tôi đang làm việc chỉ được gọi thông qua giao diện quản trị nên không có bất kỳ ràng buộc Http nào, v.v.

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

Tôi có thể đặt gì thay thế ParameterTypeHere?

Việc sử dụng cụ thể mà tôi có (lần này) là tôi muốn chuyển một cái gì đó như List<Guid>hoặc Guid[], tôi không phiền nếu tôi phải gói nó trong một lớp hoặc cái gì đó nhưng không có gì tôi đã thử hoạt động vì vậy tôi đã kết thúc việc tách một chuỗi trên dấu phẩy và phân tích cú pháp có vẻ như là một giải pháp kém.

Hiện tại, tôi có một tham số chuỗi và đang gọi nó bằng:

$ 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"

Nghiên cứu cho đến nay

Những thứ tôi đã xem xét khiến tôi vẫn không chắc mình có thể sử dụng những gì ngoài stringnhững đầu vào phức tạp hơn:

  • Chức năng Azure: Kiểu chung làm tham số đầu vào
    • https://github.com/Azure/Azure-Functions/issues/735
  • Lỗi hàm Azure - Không thể liên kết tham số với loại Chuỗi
  • Không thể liên kết tham số, vì loại tham số không được hỗ trợ bởi liên kết (HttpTrigger của Azure Functions)
  • Không thể ràng buộc ILogger trong hàm 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 với đối số enqueueTimeUtc không thành công khi được kích hoạt qua điểm cuối HTTP

Tên tham số bị bỏ qua và bạn phải chuyển nó với tên " input" bất kể tên tham số thực tế là gì. Chỉ là một điều khác để đi qua.

Thậm chí nhiều ngữ cảnh hơn

Nếu bạn đang thắc mắc tại sao bạn lại muốn có một chức năng chỉ dành cho quản trị viên, thì đây là một công việc duy nhất được thực hiện bởi người khác có quyền truy cập vào các điểm cuối quản trị. Nó dường như là thứ đơn giản nhất có thể hoạt động. An HttpTriggerlẽ ra sẽ ổn, nó chỉ có vẻ vi phạm YAGNI.

Trả lời

2 RoarS. Jan 11 2021 at 22:56

Vài tuần trước, tôi đã thử nghiệm cách chuyển đổi một API bằng cách sử dụng các hàm đặc biệt chú ý đến DI (không được hiển thị trong ví dụ bên dưới) và xác thực. Đây có thể không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng nó cho thấy rằng các lớp mô hình đơn giản có thể được sử dụng.

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

Thông tin thêm về các mẫu biểu thức ràng buộc Hàm Azure https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

Khi đọc tài liệu ở trên, hãy nhớ rằng function.json được tạo từ các chú thích khi sử dụng C #, nhưng doc hiển thị những gì có sẵn. Đã tạo function.json cho ví dụ trên:

{
  "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"
}

Xem thêm https://stackoverflow.com/a/54489040/14072498