使用应用设置的 Azure Function 2.0 json

Azure Function 2.0 using app settings json

我正在尝试遵循允许 azure 函数 (v2) 为每个环境(开发、测试、阶段、生产)使用应用程序设置 json 文件的指导。

方法 1 - 使用 ExecutionContext 基于此 article,我尝试了以下代码。这些设置永远不会从已发布代码中包含的 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 是我写的 class 是一组与 local.settings.json 文件 Values 集合中的配置相匹配的属性。这个 class 的 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# 示例吗?理想情况下,它还会显示如何管理每个环境设置,如

您可以通过设置环境变量轻松实现。

参考以下步骤:

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.jsonappsettings.json。 2个.json文件的结构相同,但存储连接字符串不同。

在appsetings.json中:

{
  "hi": "world"
}

在appsettings.dev.json中:

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

注意 在 visual studio 中,右键单击每个 json 文件 -> properties -> 设置“Copy to Output Directory”到“Copy always”。

通过 cmd 或 UI

3.Set 环境变量。 cmd命令是setxASPNETCORE_ENVIRONMENT"dev",如果要使用环境变量就重启visual studio

如果将函数部署到 azure,请在 Appsetting settings 中设置 ASPNETCORE_ENVIRONMENT

4.The输出如下:

覆盖 FunctionStartup 中的 ConfigureAppConfiguration 方法 class (https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources).

以下示例通过添加用户机密使文档中提供的示例更进一步。

public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
    FunctionsHostBuilderContext context = builder.GetContext();

    builder.ConfigurationBuilder
        .SetBasePath(context.ApplicationRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
        .AddJsonFile($"appsettings.{context.EnvironmentName}.json", optional: true, reloadOnChange: false)
        .AddUserSecrets(Assembly.GetExecutingAssembly(), true, true)
        .AddEnvironmentVariables();
}

默认情况下,appsettings.json 等配置文件不会自动复制到 Azure 函数输出文件夹。请务必查看文档 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources) 以了解对 .csproj 文件的修改。另请注意,由于该方法附加现有提供程序的方式,因此必须始终以 .AddEnvironmentVariables().

结尾

可以在

找到有关 Azure 函数中配置的更深入讨论