Какие типы можно передать в качестве параметра в приложение-функция Azure C # только для администратора?

Jan 11 2021

Какие типы разрешены в качестве параметров для приложений функций Azure, написанных на C #, которые можно вызывать только через конечную точку администратора?

Я прочитал много документации и исходного кода, но до сих пор не знаю ответа. Я ищу исчерпывающие ссылки и четкие объяснения того, что это означает и почему, а также примеры того, как реализовать функции с другими типами параметров.

Мне интересно, ожидает ли команда 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
  • Ошибка функций Azure - невозможно привязать параметр к типу String.
  • Невозможно привязать параметр, потому что тип параметра не поддерживается привязкой (HttpTrigger из функций Azure)
  • Невозможно связать ILogger в лазурной функции 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 с аргументом enqueueTimeUtc не работает при запуске через конечную точку HTTP

Имя параметра игнорируется, и вы должны передать его с именем " input" независимо от фактического имени параметра. Еще одна вещь, о которой можно споткнуться.

Еще больше контекста

Если вам интересно, зачем вам когда-либо нужна функция только для администратора, это было разовое задание, которое выполнял кто-то другой, у которого есть доступ к конечным точкам администратора. Это оказалось самым простым, что могло сработать. Было HttpTriggerбы хорошо, просто казалось, что это нарушает ЯГНИ.

Ответы

2 RoarS. Jan 11 2021 at 22:56

Несколько недель назад я тестировал, как преобразовать API с помощью функций, уделяя особое внимание DI (не показано в примере ниже) и валидации. Возможно, это не прямой ответ на ваш вопрос, но он показывает, что можно использовать простые классы моделей.

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