Que tipos você pode passar como um parâmetro para um aplicativo C # Azure Function somente para administrador?

Jan 11 2021

Quais tipos são permitidos como parâmetros para aplicativos do Azure Function escritos em C # que só podem ser chamados por meio do ponto de extremidade do administrador?

Eu li muita documentação e código-fonte e ainda não sei a resposta. Estou procurando referências definitivas e explicações claras sobre o que isso significa e por quê, além de exemplos de como implementar funções com outros tipos de parâmetro.

Estou me perguntando se a equipe do Azure espera que você aceite uma string de JSON e a analise em tipos adequados, mas a documentação que encontrei não diz.

Contexto adicional

A função específica na qual estou trabalhando deve ser chamada apenas por meio da interface de administração, portanto, não tem ligações Http etc.

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

O que posso colocar em vez de ParameterTypeHere?

O uso específico que tenho (desta vez) é que quero passar algo como List<Guid>ou Guid[], não me importo se tiver que embrulhar em uma aula ou algo, mas nada do que tentei funcionou, então acabei quebrando uma corda no vírgula e analisar os guias, o que parece uma solução ruim.

Atualmente, tenho um parâmetro de string e estou chamando-o com:

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

Pesquisa até agora

Coisas que já observei que ainda me deixam inseguro sobre o que posso usar além stringpara entradas mais complexas:

  • Funções do Azure: tipo genérico como parâmetro de entrada
    • https://github.com/Azure/Azure-Functions/issues/735
  • Erro do Azure Functions - não é possível vincular o parâmetro ao tipo String
  • Não é possível vincular o parâmetro, porque o tipo de parâmetro não é compatível com a vinculação (HttpTrigger do Azure Functions)
  • Não é possível ligar ILogger na função 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 com argumento enqueueTimeUtc falha quando acionado via endpoint HTTP

O nome do parâmetro é ignorado e você deve passá-lo com o nome " input", independentemente do nome do parâmetro real. Só outra coisa para tropeçar.

Ainda mais contexto

Se você está se perguntando por que deseja uma função apenas de administrador, este é um trabalho único executado por outra pessoa com acesso aos terminais de administração. Parecia ser a coisa mais simples que poderia funcionar. Um HttpTriggerteria sido bom, ele só apareceu para violar YAGNI.

Respostas

2 RoarS. Jan 11 2021 at 22:56

Algumas semanas atrás, testei como converter uma API usando funções com atenção especial para DI (não mostrado no exemplo abaixo) e validação. Esta pode não ser uma resposta direta à sua pergunta, mas mostra que classes de modelo simples podem ser usadas.

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

Mais informações sobre os padrões de expressão de associação do Azure Functions https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

Ao ler o documento acima, lembre-se de que function.json é gerado a partir de anotações ao usar C #, mas o documento mostra o que está disponível. Function.json gerado para o exemplo acima:

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

Veja também https://stackoverflow.com/a/54489040/14072498