Welche Typen können Sie als Parameter an eine C # Azure Function-App nur für Administratoren übergeben?
Welche Typen sind als Parameter für in C # geschriebene Azure Function-Apps zulässig, die nur über den Administratorendpunkt aufgerufen werden können?
Ich habe viel Dokumentation und Quellcode gelesen und weiß die Antwort immer noch nicht. Ich suche nach endgültigen Referenzen und klaren Erklärungen, was das bedeutet und warum, sowie nach Beispielen für die Implementierung von Funktionen mit anderen Parametertypen.
Ich frage mich, ob das Azure-Team von Ihnen erwartet, dass Sie eine JSON-Zeichenfolge akzeptieren und selbst in geeignete Typen zerlegen, aber die Dokumentation, die ich gefunden habe, sagt nichts darüber aus.
Zusätzlicher Kontext
Die spezifische Funktion, an der ich arbeite, soll nur über die Admin-Oberfläche aufgerufen werden, hat also keine HTTP-usw.-Bindungen.
[NoAutomaticTrigger]
[FunctionName(nameof(SomeFunctionName))]
public async Task SomeFunctionName(ParameterTypeHere someParameterName)
{
...
Was kann ich stattdessen setzen ParameterTypeHere
?
Die spezifische Verwendung, die ich (diesmal) habe, ist, dass ich etwas wie List<Guid>
oder weitergeben möchte Guid[]
. Es macht mir nichts aus, wenn ich es in eine Klasse oder etwas einwickeln muss, aber nichts, was ich versucht habe, hat funktioniert, also habe ich am Ende eine Zeichenfolge aufgeteilt Komma und Parsen der Guids, was wie eine schlechte Lösung scheint.
Derzeit habe ich einen String-Parameter und rufe ihn auf mit:
$ 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"
Forschung bisher
Dinge, die ich mir bereits angesehen habe, lassen mich immer noch unsicher, was ich darüber hinaus string
für komplexere Eingaben verwenden kann:
- Azure-Funktionen: Generischer Typ als Eingabeparameter
- https://github.com/Azure/Azure-Functions/issues/735
- Azure-Funktionsfehler - Parameter kann nicht an Typ String gebunden werden
- Parameter kann nicht gebunden werden, da der Parametertyp von der Bindung nicht unterstützt wird (HttpTrigger of Azure-Funktionen)
- ILogger kann in der Azure-Funktion v1 nicht gebunden werden
- 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 mit dem Argument enqueueTimeUtc schlägt fehl, wenn er über einen HTTP-Endpunkt ausgelöst wird
Der Parametername wird ignoriert und muss input
unabhängig vom tatsächlichen Parameternamen mit dem Namen " " übergeben werden. Nur eine andere Sache, über die man stolpern kann.
Noch mehr Kontext
Wenn Sie sich fragen, warum Sie jemals eine Nur-Administrator-Funktion wünschen, wurde ein einmaliger Job von einer anderen Person ausgeführt, die Zugriff auf die Administrator-Endpunkte hat. Es schien das Einfachste zu sein, was funktionieren konnte. Ein HttpTrigger
wäre in Ordnung gewesen, es schien nur YAGNI zu verletzen.
Antworten
Vor einigen Wochen habe ich getestet, wie eine API mithilfe von Funktionen konvertiert wird, wobei DI (im folgenden Beispiel nicht gezeigt) und die Validierung besonders berücksichtigt werden. Dies ist möglicherweise keine direkte Antwort auf Ihre Frage, zeigt jedoch, dass einfache Modellklassen verwendet werden können.
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);
}
}
Weitere Informationen zum Binden von Ausdrucksmustern für Azure-Funktionen https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns
Beachten Sie beim Lesen des obigen Dokuments, dass function.json bei Verwendung von C # aus Anmerkungen generiert wird, das Dokument jedoch anzeigt, was verfügbar ist. Generierte function.json für das obige Beispiel:
{
"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"
}
Siehe auch https://stackoverflow.com/a/54489040/14072498