Jenis apa yang dapat Anda berikan sebagai parameter ke aplikasi C # Azure Function khusus admin?
Jenis apa yang diizinkan sebagai parameter untuk aplikasi Azure Function yang ditulis dalam C # yang hanya dapat dipanggil melalui titik akhir admin?
Saya telah membaca banyak dokumentasi dan kode sumber dan saya masih belum tahu jawabannya. Saya mencari referensi definitif dan penjelasan yang jelas tentang apa artinya dan mengapa, ditambah contoh bagaimana mengimplementasikan fungsi dengan tipe parameter lainnya.
Saya ingin tahu apakah tim Azure mengharapkan Anda menerima string JSON dan menguraikannya sendiri menjadi jenis yang tepat, tetapi dokumentasi yang saya temukan tidak menyebutkannya.
Konteks tambahan
Fungsi spesifik yang saya kerjakan dipanggil hanya melalui antarmuka admin sehingga tidak memiliki binding Http dll.
[NoAutomaticTrigger]
[FunctionName(nameof(SomeFunctionName))]
public async Task SomeFunctionName(ParameterTypeHere someParameterName)
{
...
Apa yang bisa saya masukkan sebagai pengganti ParameterTypeHere
?
Kegunaan khusus yang saya miliki (kali ini) adalah bahwa saya ingin meneruskan sesuatu seperti List<Guid>
atau Guid[]
, saya tidak keberatan jika saya harus membungkusnya di kelas atau sesuatu tetapi tidak ada yang saya coba berhasil jadi saya akhirnya membelah string koma dan mengurai panduan yang tampaknya merupakan solusi yang buruk.
Saat ini saya punya parameter string dan memanggilnya dengan:
$ 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"
Riset sejauh ini
Hal-hal yang telah saya lihat yang membuat saya masih tidak yakin apa yang dapat saya gunakan selain string
untuk input yang lebih kompleks:
- Azure Functions: Tipe umum sebagai parameter input
- https://github.com/Azure/Azure-Functions/issues/735
- Kesalahan Azure Functions - Tidak dapat mengikat parameter untuk mengetik String
- Tidak dapat mengikat parameter, karena jenis parameter tidak didukung oleh pengikatan (HttpTrigger of Azure Functions)
- Tidak dapat mengikat ILogger dalam fungsi 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 dengan argumen enqueueTimeUtc gagal saat dipicu melalui titik akhir HTTP
Nama parameter diabaikan, dan Anda harus meneruskannya dengan nama " input
" terlepas dari nama parameter sebenarnya. Hanya satu hal lagi untuk tersandung.
Bahkan lebih banyak konteks
Jika Anda bertanya-tanya mengapa Anda menginginkan fungsi khusus admin, ini untuk pekerjaan satu kali dijalankan oleh orang lain yang memiliki akses ke titik akhir admin. Tampaknya itu adalah hal paling sederhana yang bisa berhasil. An HttpTrigger
akan baik-baik saja, sepertinya melanggar YAGNI.
Jawaban
Beberapa minggu yang lalu, saya menguji cara mengonversi API menggunakan fungsi dengan perhatian khusus pada DI (tidak ditunjukkan dalam contoh di bawah) dan validasi. Ini mungkin bukan jawaban langsung untuk pertanyaan Anda, tetapi ini menunjukkan bahwa kelas model biasa dapat digunakan.
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);
}
}
Informasi selengkapnya tentang pola ekspresi pengikatan Fungsi Azure https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns
Saat membaca dokumen di atas, perlu diingat bahwa function.json dihasilkan dari anotasi saat menggunakan C #, tetapi dokumen menunjukkan apa yang tersedia. Menghasilkan function.json untuk contoh di atas:
{
"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"
}
Lihat juga https://stackoverflow.com/a/54489040/14072498