Azure Функция 2.0 с использованием настроек приложения json - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь следовать указаниям, которые позволят azure функциям (v2) использовать файлы настроек приложения json файлов для каждой среды (dev, test, stage, prod).

Approach 1 - Использование ExecutionContext На основании этой статьи я попытался выполнить следующий код. Настройки никогда не возвращаются из local.settings. json, который включен в опубликованный код.

    [FunctionName("ScheduleApp")]
    public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
    {
        log.LogInformation($"ScheduleApp triggered...");

        try
        {
            var configurationBuilder = new ConfigurationBuilder()
               .SetBasePath(context.FunctionAppDirectory)
               .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .Build();
            var y = configurationBuilder.GetConnectionStringOrSetting("somesetting");
            var x = configurationBuilder["test"];
            log.LogInformation($"x = {x}, y = {y});
        }
        catch (Exception ex)
        {
            log.LogInformation($"exception = {ex.Message}");
        }

Подход 2. Использование startup.cs ConfigurationBuilder
FunctionOptions.cs - это написанный мной класс, представляющий собой набор свойств, соответствующих конфигурации в local.settings. json file Коллекция значений. IOptionsMonitor этого класса передается в конструкторе функции azure, показанной ниже. значения из файла json также не возвращаются в этом подходе.

Startup.cs ....

    public override void Configure(IFunctionsHostBuilder builder)
    {
        var configurationBuilder = new ConfigurationBuilder();

        var descriptor = builder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
        if (descriptor?.ImplementationInstance is IConfigurationRoot configuration)
        {
            configurationBuilder.AddConfiguration(configuration);
        }
        Configuration = configurationBuilder.Build();

        builder.Services.AddOptions<FunctionOptions>();
        builder.Services.Configure<FunctionOptions>(Configuration);
        builder.Services.Configure<FunctionOptions>(Configuration.GetSection("Values"));
    }

ScheduleApp.cs ....

    public ScheduleApp(IConfiguration configuration, IOptionsMonitor<FunctionOptions> optionsAccessor)
    {
        _functionOptions = optionsAccessor.CurrentValue;
        _configuration = configuration;
    }

[FunctionName("ScheduleApp")]
    public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
    {
        log.LogInformation($"ScheduleApp triggered...");

      try
        {
            var z = "";
            if (_functionOptions != null)
                z = _functionOptions.somesetting;
            else
                log.LogInformation("_funcionsOption is null");

            log.LogInformation($"_funcionsOption = {z}");
        }
        catch (Exception ex)
        {
            log.LogInformation($"_funcionsOption exception, ex={ex.Message}");
        }

Ни один из этих подходов не дает значений конфигурации. Я попытался добавить файлы. json в качестве содержимого в функцию azure. Я поиграл с переменной окружения AZURE_FUNCTIONS_ENVIRONMENT, так как ожидал, что это будет контролировать, какой набор настроек использовался (средой). Ничего не работает.

Я что-то упускаю. Может кто-то указать на то, что мне не хватает или на рабочий c# образец того или иного подхода? В идеале было бы также показано, как управлять каждым параметром среды, как в

  • appsettings.dev. json
  • appsettings.test. json
  • appsettings. stage. json
  • appsettings.prod. json

1 Ответ

0 голосов
/ 28 января 2020

Этого легко добиться, установив переменную среды.

См. Следующие шаги:

1.In function.cs:

public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ExecutionContext context, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    Console.WriteLine($"the environment is: " + environment);
    var configurationBuilder = new ConfigurationBuilder()
        .SetBasePath(context.FunctionAppDirectory)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();
    var value = configurationBuilder.GetConnectionStringOrSetting("hi");
    log.LogInformation($"value = {value}");
    return (ActionResult)new OkObjectResult($"Hello, {value}");
}

2.Then добавьте 2. json файлов в проект: appsettings.dev.json и appsettings.json. Структура файлов 2. json одинакова, но имеет разные строки подключения к хранилищу.

В приложениях. json:

{
  "hi": "world"
}

В файле appsettings.dev. json:

{
  "hi":"i am dev appsettings"
}

Обратите внимание , что в Visual Studio щелкните правой кнопкой мыши каждый файл json -> properties -> установите "Copy to Output Directory" на "Copy always Msgstr ".

3.Установите переменную окружения через cmd или UI. Команда cmd: setx ASPNETCORE_ENVIRONMENT "dev", затем перезапустите Visual Studio, если хотите использовать переменную среды.

enter image description here

Если вы развернете для функции azure установите ASPNETCORE_ENVIRONMENT в Appsetting settings.

enter image description here

4. Выход будет следующим:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...