Que tipos você pode passar como um parâmetro para um aplicativo C # Azure Function somente para administrador?
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 string
para 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 HttpTrigger
teria sido bom, ele só apareceu para violar YAGNI.
Respostas
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