从Azure函数中的local.settings.json中读取自定义设置

时间:2018-08-10 07:31:53

标签: c# azure azure-functions

我正在尝试从local.settings.json文件中检索自定义设置。示例我正在尝试读取以下local.settings.json文件中存在的表列表

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "TableList": "TestTableName1,TestTableName2"
  }
}

使用下面的代码阅读

string tableslist = ConfigurationManager.AppSettings["TableList"];

,它可以工作,但是我在一些地方读到,它仅在本地调试时有效,在生产环境中部署后可能无法工作。有人可以指出我如何正确执行此操作吗?还是该问题仅适用于与连接字符串相关的设置?

2 个答案:

答案 0 :(得分:12)

@Kirk和@Slava帮助您摆脱混乱。只需添加一些细节供您参考即可。

默认情况下,发布既不会将local.settings.json上传到Azure,也不会基于该本地文件对应用程序设置进行修改,因此我们需要在Azure门户上手动更新它们。我们也可以在VS发布面板上执行此操作。(如果需要在发布之前更改设置,请先创建配置文件。)

enter image description here

关于如何在应用程序设置中获取参数,需要注意的一件事是v2函数(运行时beta)不再支持ConfigurationManager,它只能得到null或异常。对于v1函数(运行时〜1),它仍然有效。

  1. 用于v1功能

    要读取Azure(以及local.settings.json中的Values)上的应用程序设置,建议使用System.Environment.GetEnvironmentVariable($"{parameterName}")

    转到连接字符串,不幸的是,GetEnvironmentVariable仅在Azure上有效,因为连接字符串(local.settings.json中的ConnectionStrings)没有导入到环境变量中。因此,我们需要ConfigurationManager,它可以在Azure和本地环境中使用。当然,它也可以读取应用程序设置。

  2. 对于v2功能,“应用程序设置”和“连接字符串”都有两个选择。

    一种是使用GetEnvironmentVariable。我们可以参考this list以获得Azure上连接字符串的前缀。

    // Get Application settings
    var appParameter= "AzureWebJobsStorage";
    System.Environment.GetEnvironmentVariable($"{appParameter}");
    
    // Get Connection strings(put local and Azure env together)
    var connParameter= "MySqlAzureConnection";
    var Prefix = "SQLAZURECONNSTR_";
    var connectionString = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{connParameter}");
    if(string.IsNullOrEmpty(connectionString )){
       connectionString = System.Environment.GetEnvironmentVariable($"{Prefix}{connParameter}");
    }
    

    另一种方法是使用ConfigurationBuilder。添加ExecutionContext参数,该参数用于定位功能应用程序目录。

    [FunctionName("FunctionName")]
    public static void Run(...,ExecutionContext context)
    {
       //"Values" and "Connection" sections are injected into EnvironmentVariables automatically hence we don't need to load Json file again. 
       //Hence SetBasePath and AddJsonFile are only necessary if you have some custom settings(e.g. nested Json rather than key-value pairs) outside those two sections. It's recommended to put those setting to another file if we need to publish them.
       //Note that Function binding settings(e.g. Storage Connection String) must be EnvironmentVariables, i.e. must be stored in "Values" section.
        var config = new ConfigurationBuilder()
            .SetBasePath(context.FunctionAppDirectory)
            .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
    
        // Get Application Settings
        var appParameter= "AzureWebJobsStorage";
        string appsetting = config[$"{appParameter}"];
    
        // Get Connection strings
        var connParameter= "MySqlAzureConnection";
        string connectionString = config.GetConnectionString($"{connParameter}");
    }
    

答案 1 :(得分:0)

在.Net Core Azure函数中使用Environment.GetEnvironmentVariable时,我必须添加EnvironmentVariableTarget.Process参数以检索连接字符串

Window->Preferences->General->Workspace: New Text file line delimiter

我的local.settings.json看起来像这样:

- android.useAndroidX=true
- android.enableJetifier=true