Azure Function 读取 local.settings.json 到对象

mac*_*acm 3 c# json azure azure-functions

我知道我可以在 local.settings.json 的 value {} 部分下添加所有环境变量。然而,我正在努力保持家里整洁,并且希望我能做这样的事情。

本地.settings.json

   {
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsDashboard": "",
"Hello": "world"
 },
"ClientConfiguration": {
    "this": "that",
    "SubscriberEndpoint": "",
    "Username": "",
    "Password": "",
    "ObjectEndpoint": ""
 }
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中我有

 var config = JsonConvert.DeserializeObject<myConnectionObject> (Environment.GetEnvironmentVariable("ClientConfiguration"));
Run Code Online (Sandbox Code Playgroud)

无论我做什么,我都无法让它发挥作用。为什么我至少无法获取 ClientConfiguration 的内容?只是不断返回空值。

如果我将 ClientConfiguration {} 添加到类似的值

..."Values" : { ... 
"Hello":"world",
"ClientCOnfiguration" : {above}
}
Run Code Online (Sandbox Code Playgroud)

我最终得到一个错误,说找不到 azurewebjobsstorage 并且“功能设置列表”只是空的

Jer*_*Liu 5

对于local.settings.json,只有Valuessection可以导入到环境变量中。(如果你的函数是v2,则ConnectionStringssection也存在于环境变量中)。所以你会看到结果为 null。

更重要的是,Valuessection是a Dictionary<string, string>,这意味着值不能是除字符串之外的其他格式。因此你的ClientCOnfiguration内部结果是错误的。

由于您想重新组织这些设置,因此序列化ClientConfiguraiton以将其存储Values似乎不是一个好的选择。我们可能只需要读取和解析 Json 文件。

添加ExecutionContext context您的函数方法签名并尝试下面的代码。

var reader = new StreamReader(context.FunctionAppDirectory+"/local.settings.json");
var myJson = reader.ReadToEnd();
dynamic config =  JsonConvert.DeserializeObject(myJson);
var clientConfiguration = config.ClientConfiguration as JObject;
myConnectionObject mco = clientConfiguration.ToObject<myConnectionObject>();
Run Code Online (Sandbox Code Playgroud)

如果您的函数是 v2,则还有另一种方法ConfigurationBuilder

var config = new ConfigurationBuilder()
    .SetBasePath(context.FunctionAppDirectory)
    .AddJsonFile("local.settings.json", optional: false, reloadOnChange: true)
    .AddEnvironmentVariables()
    .Build();
var mco = new myConnectionObject();
config.GetSection("ClientConfiguration").Bind(mco);
Run Code Online (Sandbox Code Playgroud)

请注意,这local.settings.json是针对本地开发的,默认情况下不会上传到 Azure。需要删除<CopyToPublishDirectory>Never</CopyToPublishDirectory>functionname.csproj.