Yalnızca yönetici içeren bir C # Azure Function uygulamasına parametre olarak hangi türleri iletebilirsiniz?
Yalnızca yönetici uç noktası aracılığıyla çağrılabilen, C # ile yazılmış Azure Function uygulamaları için parametreler olarak hangi türlere izin verilir?
Çok sayıda belge ve kaynak kodu okudum ve hala cevabı bilmiyorum. Bunun ne anlama geldiğine ve neden olduğuna dair kesin referanslar ve net açıklamalar, artı diğer parametre türleriyle işlevlerin nasıl uygulanacağına dair örnekler arıyorum.
Azure ekibinin sizden bir JSON dizesini kabul etmenizi ve onu uygun türlere ayırmanızı bekleyip beklemediğini merak ediyorum, ancak bulduğum belgeler bunu söylemiyor.
Ek içerik
Üzerinde çalıştığım belirli işlev yalnızca yönetici arabirimi aracılığıyla çağrılacak, bu nedenle herhangi bir Http vb. Bağlaması yok.
[NoAutomaticTrigger]
[FunctionName(nameof(SomeFunctionName))]
public async Task SomeFunctionName(ParameterTypeHere someParameterName)
{
...
Yerine ne koyabilirim ParameterTypeHere
?
Sahip olduğum özel kullanım (bu sefer) şudur: List<Guid>
veya gibi bir şeyi geçmek istiyorum Guid[]
, bunu bir sınıfa veya başka bir şeye sarmak zorunda olsam umurumda değil ama denediğim hiçbir şey işe yaramadı, bu yüzden bir dizeyi ayırdım. virgülle ve kötü bir çözüm gibi görünen kılavuzları ayrıştırmak.
Şu anda bir string parametrem var ve bunu şu şekilde çağırıyorum:
$ 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"
Şimdiye kadar araştırma
Daha önce baktığım şeyler string
, daha karmaşık girdiler için ötesinde ne kullanabileceğime hala emin olmamı sağlıyor :
- Azure İşlevleri: Giriş parametresi olarak genel tür
- https://github.com/Azure/Azure-Functions/issues/735
- Azure İşlevleri hatası - Dize türüne parametre bağlanamıyor
- Parametre bağlanamaz, parametre türünün bağlama tarafından desteklenmemesine neden olur (Azure İşlevlerinin HttpTrigger'ı)
- Azure işlevi v1'de ILogger'a bağlanılamıyor
- 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
- EnqueueTimeUtc bağımsız değişkenine sahip ServiceBusTrigger, HTTP uç noktası aracılığıyla tetiklendiğinde başarısız oluyor
Parametre adı göz ardı edilir ve input
gerçek parametre adından bağımsız olarak bunu " " adıyla geçirmeniz gerekir . Sadece takılıp düşmek için başka bir şey.
Daha fazla bağlam
Neden yalnızca yönetici işlevi istediğinizi merak ediyorsanız, bu, yönetici uç noktalarına erişimi olan bir başkası tarafından tek seferlik bir işin yürütülmesi içindi. İşe yarayabilecek en basit şey gibi görünüyordu. An iyi HttpTrigger
olurdu, sadece YAGNI'yi ihlal ediyormuş gibi görünüyordu.
Yanıtlar
Birkaç hafta önce, DI'ye (aşağıdaki örnekte gösterilmemiştir) ve doğrulamaya özel dikkat göstererek işlevleri kullanarak bir API'nin nasıl dönüştürüleceğini test ettim. Bu, sorunuza doğrudan bir cevap olmayabilir, ancak düz model sınıfların kullanılabileceğini gösterir.
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);
}
}
Azure İşlevleri bağlama ifade desenleri hakkında daha fazla bilgi https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns
Yukarıdaki belgeyi okurken, function.json'un C # kullanırken ek açıklamalardan oluşturulduğunu, ancak doc'un nelerin mevcut olduğunu gösterdiğini unutmayın. Yukarıdaki örnek için oluşturulmuş function.json:
{
"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"
}
Ayrıca bakınız https://stackoverflow.com/a/54489040/14072498