관리자 전용 C # Azure Function 앱에 매개 변수로 전달할 수있는 유형은 무엇입니까?

Jan 11 2021

관리 끝점을 통해서만 호출 할 수있는 C #으로 작성된 Azure Function 앱의 매개 변수로 허용되는 유형은 무엇인가요?

많은 문서와 소스 코드를 읽었지만 여전히 답을 모릅니다. 그 의미와 이유에 대한 명확한 참조와 명확한 설명 및 다른 매개 변수 유형으로 함수를 구현하는 방법에 대한 예제를 찾고 있습니다.

Azure 팀이 JSON 문자열을 받아 적절한 형식으로 직접 구문 분석 할 것으로 예상하는지 궁금합니다.하지만 내가 찾은 설명서에는 설명이 없습니다.

추가 컨텍스트

내가 작업하는 특정 기능은 관리자 인터페이스를 통해서만 호출되므로 Http 등 바인딩이 없습니다.

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

대신 무엇을 넣을 수 ParameterTypeHere있습니까?

내가 (이번에) 사용하는 특정 용도는 List<Guid>또는 같은 것을 전달하고 싶다는 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 Functions : 입력 매개 변수로 일반 형식
    • https://github.com/Azure/Azure-Functions/issues/735
  • Azure Functions 오류-매개 변수를 문자열 형식에 바인딩 할 수 없습니다.
  • 매개 변수를 바인딩 할 수 없습니다. 바인딩에서 매개 변수 형식을 지원하지 않기 때문입니다 (Azure Functions의 HttpTrigger).
  • Azure 함수 v1에서 ILogger를 바인딩 할 수 없습니다.
  • 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
  • HTTP 끝점을 통해 트리거 될 때 enqueueTimeUtc 인수가있는 ServiceBusTrigger가 실패 함

매개 변수 이름은 무시 input되며 실제 매개 변수 이름에 관계없이 " " 이름으로 전달해야합니다 . 넘어갈 또 다른 일.

더 많은 맥락

관리자 전용 기능이 필요한 이유가 궁금하다면 관리자 엔드 포인트에 액세스 할 수있는 다른 사람이 일회성 작업을 실행하기위한 것입니다. 작동 할 수있는 가장 간단한 것 같았습니다. A HttpTrigger는 괜찮 았을 것입니다. 단지 YAGNI를 위반하는 것처럼 보입니다.

답변

2 RoarS. Jan 11 2021 at 22:56

몇 주 전에 DI (아래 예에 표시되지 않음) 및 유효성 검사에 특별히주의를 기울인 함수를 사용하여 API를 변환하는 방법을 테스트했습니다. 이것은 귀하의 질문에 대한 직접적인 대답은 아니지만 일반 모델 클래스를 사용할 수 있음을 보여줍니다.

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 Functions 바인딩 식 패턴 에 대한 추가 정보 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

위의 문서를 읽을 때 C #을 사용할 때 function.json 이 주석에서 생성되지만 doc는 사용 가능한 것을 보여줍니다. 위의 예에 대해 생성 된 function.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