我正在尝试从local.settings.json文件中检索自定义设置。示例我正在尝试读取以下local.settings.json文件中存在的表列表
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsDashboard": "UseDevelopmentStorage=true",
"TableList": "TestTableName1,TestTableName2"
}
}
使用下面的代码阅读
string tableslist = ConfigurationManager.AppSettings["TableList"];
,它可以工作,但是我在一些地方读到,它仅在本地调试时有效,在生产环境中部署后可能无法工作。有人可以指出我如何正确执行此操作吗?还是该问题仅适用于与连接字符串相关的设置?
答案 0 :(得分:12)
@Kirk和@Slava帮助您摆脱混乱。只需添加一些细节供您参考即可。
默认情况下,发布既不会将local.settings.json上传到Azure,也不会基于该本地文件对应用程序设置进行修改,因此我们需要在Azure门户上手动更新它们。我们也可以在VS发布面板上执行此操作。(如果需要在发布之前更改设置,请先创建配置文件。)
关于如何在应用程序设置中获取参数,需要注意的一件事是v2函数(运行时beta)不再支持ConfigurationManager
,它只能得到null或异常。对于v1函数(运行时〜1),它仍然有效。
用于v1功能
要读取Azure(以及local.settings.json中的Values
)上的应用程序设置,建议使用System.Environment.GetEnvironmentVariable($"{parameterName}")
。
转到连接字符串,不幸的是,GetEnvironmentVariable仅在Azure上有效,因为连接字符串(local.settings.json中的ConnectionStrings
)没有导入到环境变量中。因此,我们需要ConfigurationManager,它可以在Azure和本地环境中使用。当然,它也可以读取应用程序设置。
对于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