Quali tipi è possibile passare come parametro a un'app per le funzioni di Azure C # solo per amministratori?

Jan 11 2021

Quali tipi sono consentiti come parametri per le app per le funzioni di Azure scritte in C # che possono essere richiamate solo tramite l'endpoint di amministrazione?

Ho letto molta documentazione e codice sorgente e ancora non conosco la risposta. Sto cercando riferimenti definitivi e spiegazioni chiare su cosa significa e perché, oltre a esempi su come implementare funzioni con altri tipi di parametri.

Mi chiedo se il team di Azure si aspetta che tu accetti una stringa di JSON e la analizzi tu stesso in tipi appropriati, ma la documentazione che ho trovato non lo dice.

Contesto aggiuntivo

La funzione specifica su cui sto lavorando deve essere chiamata solo tramite l'interfaccia di amministrazione, quindi non ha collegamenti Http ecc.

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

Cosa posso mettere al posto di ParameterTypeHere?

L'uso specifico che ho (questa volta) è che voglio passare qualcosa come List<Guid>o Guid[], non mi importa se devo avvolgerlo in una classe o qualcosa del genere ma niente di ciò che ho provato ha funzionato quindi ho finito per dividere una stringa virgola e analizzando le guide che sembra una soluzione scadente.

Attualmente ho un parametro stringa e lo chiamo 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"

Finora la ricerca

Le cose che ho già esaminato che mi lasciano ancora incerto su cosa posso usare oltre stringper input più complessi:

  • Funzioni di Azure: tipo generico come parametro di input
    • https://github.com/Azure/Azure-Functions/issues/735
  • Errore di Funzioni di Azure: impossibile associare il parametro al tipo String
  • Impossibile associare il parametro, perché il tipo di parametro non è supportato dall'associazione (HttpTrigger di funzioni di Azure)
  • Impossibile associare ILogger nella funzione 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 l'argomento enqueueTimeUtc non riesce se attivato tramite l'endpoint HTTP

Il nome del parametro viene ignorato e devi passarlo con il nome " input" indipendentemente dal nome del parametro effettivo. Solo un'altra cosa su cui inciampare.

Ancora più contesto

Se ti stai chiedendo perché vorresti mai una funzione solo amministratore, questo era per un lavoro una tantum da eseguire da qualcun altro che ha accesso agli endpoint di amministrazione. Sembrava la cosa più semplice che potesse funzionare. HttpTriggerUn'ammenda sarebbe stata, è appena apparso a violare YAGNI.

Risposte

2 RoarS. Jan 11 2021 at 22:56

Alcune settimane fa, ho testato come convertire un'API utilizzando funzioni con particolare attenzione al DI (non mostrato nell'esempio sotto) e alla convalida. Questa potrebbe non essere una risposta diretta alla tua domanda, ma mostra che possono essere utilizzate classi modello semplici.

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

Altre informazioni sui modelli di espressione di associazione di Funzioni di Azure https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

Durante la lettura del documento precedente, tieni presente che function.json viene generato dalle annotazioni quando si usa C #, ma il documento mostra cosa è disponibile. Function.json generato per l'esempio precedente:

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

Guarda anche https://stackoverflow.com/a/54489040/14072498