管理者専用のC#Azure Functionアプリにパラメーターとして渡すことができるタイプは何ですか?

Jan 11 2021

管理エンドポイントを介してのみ呼び出すことができる、C#で記述されたAzure Functionアプリのパラメーターとして許可されるタイプは何ですか?

私はたくさんのドキュメントとソースコードを読みましたが、まだ答えがわかりません。それが何を意味するのか、そしてその理由についての明確な参照と明確な説明に加えて、他のパラメータータイプで関数を実装する方法の例を探しています。

Azureチームは、JSONの文字列を受け入れて、それを適切な型に自分で解析することを期待しているかどうか疑問に思っていますが、私が見つけたドキュメントには記載されていません。

追加のコンテキスト

私が取り組んでいる特定の関数は、管理インターフェースを介してのみ呼び出されるため、Httpなどのバインディングはありません。

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

代わりに何を置くことができParameterTypeHereますか?

私が(今回)持っている特定の用途は、List<Guid>またはのようなものを渡したいということです、Guid[]それをクラスなどでラップする必要があるかどうかは気にしませんが、何も試していなかったので、文字列を分割することになりましたカンマとギッドの解析は、解決策としては不十分なようです。

現在、文字列パラメータがあり、次のように呼び出しています。

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

これまでの研究

私がすでに見たものは、私がstringより複雑な入力のためにそれを超えて何を使用できるかまだわからないままにします:

  • Azure関数:入力パラメーターとしてのジェネリック型
    • https://github.com/Azure/Azure-Functions/issues/735
  • AzureFunctionsエラー-パラメーターを文字列型にバインドできません
  • パラメーターをバインドできません。パラメーターの種類がバインドでサポートされていないためです(Azure FunctionsのHttpTrigger)
  • Azure関数v1でILoggerをバインドできません
  • 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引数を持つServiceBusTriggerは、HTTPエンドポイントを介してトリガーされると失敗します

パラメータ名は無視されるinputため、実際のパラメータ名に関係なく、「」という名前で渡す必要があります。つまずくもう一つのこと。

さらに多くのコンテキスト

管理者専用の機能が必要な理由がわからない場合、これは、管理エンドポイントにアクセスできる他の誰かが1回限りのジョブを実行するためのものでした。それはうまくいくことができる最も単純なものであるように見えました。それHttpTriggerは大丈夫だったでしょう、それはただYAGNIに違反しているように見えました。

回答

2 RoarS. Jan 11 2021 at 22:56

数週間前、DI(以下の例には示されていません)と検証に特別な注意を払って関数を使用してAPIを変換する方法をテストしました。これはあなたの質問に対する直接の答えではないかもしれませんが、プレーンモデルクラスが使用される可能性があることを示しています。

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

式パターンをバインドするAzureFunctionsの詳細 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-expressions-patterns

上記のドキュメントを読むときは、function.jsonはC#を使用するときにアノテーションから生成されることに注意してください。ただし、ドキュメントには利用可能なものが示されています。上記の例で生成された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"
}

も参照してください https://stackoverflow.com/a/54489040/14072498