¿Qué tipos se pueden pasar como parámetro a una aplicación de función de Azure de C # solo para administradores?

Jan 11 2021

¿Qué tipos se permiten como parámetros para las aplicaciones de función de Azure escritas en C # que solo se pueden llamar a través del punto de conexión de administrador?

He leído mucha documentación y código fuente y todavía no sé la respuesta. Estoy buscando referencias definitivas y explicaciones claras sobre lo que eso significa y por qué, además de ejemplos de cómo implementar funciones con otros tipos de parámetros.

Me pregunto si el equipo de Azure espera que acepte una cadena de JSON y la analice usted mismo en los tipos adecuados, pero la documentación que encontré no lo dice.

Contexto adicional

La función específica en la que estoy trabajando debe llamarse solo a través de la interfaz de administración, por lo que no tiene enlaces Http, etc.

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

¿Qué puedo poner en lugar de ParameterTypeHere?

El uso específico que tengo (esta vez) es que quiero pasar algo como List<Guid>o Guid[], no me importa si tengo que envolverlo en una clase o algo, pero nada de lo que probé funcionó, así que terminé dividiendo una cadena en coma y analizando las guías, lo que parece una mala solución.

Actualmente tengo un parámetro de cadena y lo estoy llamando con:

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

Investigación hasta ahora

Las cosas que ya he visto y que aún me dejan sin saber qué puedo usar más allá stringpara entradas más complejas:

  • Funciones de Azure: tipo genérico como parámetro de entrada
    • https://github.com/Azure/Azure-Functions/issues/735
  • Error de Azure Functions: no se puede vincular el parámetro al tipo String
  • No se puede enlazar el parámetro, porque el tipo de parámetro no es compatible con el enlace (HttpTrigger of Azure Functions)
  • No se puede vincular ILogger en la función 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 con el argumento enqueueTimeUtc falla cuando se activa a través de un extremo HTTP

El nombre del parámetro se ignora y debe pasarlo con el nombre " input" independientemente del nombre del parámetro real. Solo otra cosa con la que tropezar.

Aún más contexto

Si se pregunta por qué querría alguna vez una función solo de administrador, esto fue para que alguien más que tenga acceso a los puntos finales de administrador ejecute un trabajo único. Parecía ser la cosa más simple que podía funcionar. An HttpTriggerhabría estado bien, simplemente parecía violar YAGNI.

Respuestas

2 RoarS. Jan 11 2021 at 22:56

Hace algunas semanas, probé cómo convertir una API usando funciones con especial atención a DI (no se muestra en el siguiente ejemplo) y validación. Es posible que esta no sea una respuesta directa a su pregunta, pero muestra que se pueden usar clases de modelo simple.

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

Más información sobre los patrones de expresión de enlace de Azure Functions https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

Al leer el documento anterior, tenga en cuenta que function.json se genera a partir de anotaciones cuando se usa C #, pero el documento muestra lo que está disponible. Function.json generado para el ejemplo anterior:

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

Ver también https://stackoverflow.com/a/54489040/14072498