如何在azure函数中的C#startup.cs类中读取azure应用程序配置值

Ars*_*ngh 0 c# azure-functions azure-app-configuration

我已在 Azure 应用程序配置中添加键值对,并尝试在 Startup.cs 类文件中读取它。请建议如何做到这一点。

public class Startup : FunctionsStartup
{
    private static readonly string url= "*******************";
   
    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        string connectionString=????? //How to get this value from Azure app config
        builder.Services.AddDbContext<DbContext, Context>(
            options => SqlServerDbContextOptionsExtensions.UseSqlServer(options, connectionString));
       builder.ConfigurationBuilder.AddAzureAppConfiguration(url);
    }
}
Run Code Online (Sandbox Code Playgroud)

pin*_*x33 12

您需要将配置的配置应用程序服务的注册中分离出来。换句话说,Azure 应用程序配置的设置应该在其中完成ConfigureAppConfiguration,而您的注册DbContext应该从该方法完成Configure。这将允许您访问方法中Configuration的属性来检索连接字符串:FunctionsHostBuilderContextConfigure

public class Startup : FunctionsStartup
{
    private static readonly string url= "*******************";
   
    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        // register AzureAppConfiguration only
        builder.ConfigurationBuilder.AddAzureAppConfiguration(url);
    }

    public override void Configure(IFunctionsHostBuilder builder)
    {
        var context = build.GetContext();
        var config = context.Configuration;

        string connectionString = config["AzureAppConfigKeyName"];
        builder.Services.AddDbContext<DbContext, Context>(
            options => SqlServerDbContextOptionsExtensions.UseSqlServer(options, connectionString)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

传递给对象索引器的值config将取决于您在 Azure 应用程序配置中为密钥命名的内容。假设您将其称为“DatabaseConnectionString”,那么这正是您将传递的内容,即:config["DatabaseConnectionString"]

前缀

Azure 应用程序配置有一些功能可以控制应用程序处理键名称的方式,特别是“修剪前缀”的功能。您在这里没有使用它(因为您只是传递 URL),但假设您在 Azure 应用程序配置中有密钥,例如MyFunction:DatabaseConnectionString. 默认情况下,您将使用它的全名来访问它:

var cs1 = config["MyFunction:DatabaseConnectionString"];
// or
var cs2 = config.GetSection("MyFunction")["DatabaseConnectionString"];
Run Code Online (Sandbox Code Playgroud)

不过,您可以指定长格式连接选项。这将允许您仅选择以该前缀开头的键并可选择将其修剪掉:

builder.ConfigurationBuilder.AddAzureAppConfiguration(s => 
{
    s.Connect(url, new DefaultAzureCredential());
    s.Select("MyFunction:*");
    s.TrimKeyPrefix("MyFunction:");
});
Run Code Online (Sandbox Code Playgroud)

现在,您的连接字符串可以使用更短的密钥:

string connectionString = config["DatabaseConnectionString"];
Run Code Online (Sandbox Code Playgroud)

如果您的 Azure 应用程序配置实例中有许多不同的设置,并且只想提取与您的应用程序特别相关的设置(标签也可用于此目的),则此功能特别有用。

Azure 应用程序配置连接 - 环境变量

最后,提一个建议。不要url在应用程序中存储硬编码的 Azure 应用程序配置实例的连接详细信息。为此利用环境变量。Azure 应用服务/Azure Functions 中的“应用程序设置”会自动作为环境变量添加到应用程序中。

在运行之前 ConfigureAppConfiguration,一组默认的配置源已添加到上下文/构建器中。其中包括host.jsonappsettings.jsonlocal.settings.json(本地运行时)和环境变量。配置 Azure 应用程序配置链接的“更好”方法是使用此机制。

例如,您可以添加名为AzureAppConfigUrl包含以下值的 FunctionApp 应用程序设置:

应用程序设置

在本地,您可以将相应的条目添加到 local.settings.json 文件中:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AzureAppConfigUrl": "https://your-configuration.azconfig.io"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在配置 Azure 应用程序配置时引用此值。在本地,它将从 JSON 文件中提取数据,当在 Azure 中运行时,它将从应用程序设置(或者更确切地说,环境变量)中读取:

public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
   var context = build.GetContext();
   var url = context.Configuration["AzureAppConfigUrl"];
   builder.ConfigurationBuilder.AddAzureAppConfiguration(url);
}
Run Code Online (Sandbox Code Playgroud)