使用应用设置的 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# 示例吗?理想情况下,它还会显示如何管理每个环境设置,如
- appsettings.dev.json
- appsettings.test.json
- appsettings.stage.json
- appsettings.prod.json
您可以通过设置环境变量轻松实现。
参考以下步骤:
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文件的结构相同,但存储连接字符串不同。
在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 函数中配置的更深入讨论
我正在尝试遵循允许 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# 示例吗?理想情况下,它还会显示如何管理每个环境设置,如
- appsettings.dev.json
- appsettings.test.json
- appsettings.stage.json
- appsettings.prod.json
您可以通过设置环境变量轻松实现。
参考以下步骤:
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文件的结构相同,但存储连接字符串不同。
在appsetings.json中:
{
"hi": "world"
}
在appsettings.dev.json中:
{
"hi":"i am dev appsettings"
}
注意 在 visual studio 中,右键单击每个 json 文件 -> properties
-> 设置“Copy to Output Directory
”到“Copy always
”。
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().
结尾可以在