Функция Azure Считайте local.settings.json для объекта - PullRequest
0 голосов
/ 16 октября 2018

Я знаю, что могу добавить все переменные окружения в секции values ​​{} файла local.settings.json.Тем не менее, я стараюсь поддерживать порядок в доме и хотел бы, чтобы я мог сделать что-то подобное.

local.settings.json

   {
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsDashboard": "",
"Hello": "world"
 },
"ClientConfiguration": {
    "this": "that",
    "SubscriberEndpoint": "",
    "Username": "",
    "Password": "",
    "ObjectEndpoint": ""
 }
}

в моем коде у меня есть

 var config = JsonConvert.DeserializeObject<myConnectionObject> (Environment.GetEnvironmentVariable("ClientConfiguration"));

Независимо от того, что я делаю, я не могу заставить это работать.Почему я не могу хотя бы получить содержимое ClientConfiguration?Просто продолжает возвращаться ноль.

ЕСЛИ я добавляю ClientConfiguration {} к таким значениям, как

..."Values" : { ... 
"Hello":"world",
"ClientCOnfiguration" : {above}
}

Я получаю сообщение об ошибке, в котором говорится, что azurewebjobsstorage не может быть найден, а «список настроек func» просто пуст

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Для local.settings.json только переменная Values может быть импортирована в переменные окружения. (Если ваша функция v2, секция ConnectionStrings также присутствует в переменных окружения).Таким образом, вы видите нулевой результат.

Более того, секция Values представляет собой 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>();

Если ваша функция 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);

Обратите внимание, что local.settings.json для локального разработчика, по умолчанию он не будет загружен в Azure.Нужно удалить <CopyToPublishDirectory>Never</CopyToPublishDirectory> в functionname.csproj.

0 голосов
/ 05 марта 2019

Если вы не хотите создавать новый ConfigurationBuilder, вы можете просто отформатировать свои настройки другим способом.Ваш файл local.settings.json будет выглядеть следующим образом:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "",
    "Hello": "world",
    "ClientConfiguration__this": "that",
    "ClientConfiguration__SubscriberEndpoint": "........",
    "ClientConfiguration__Username": "........",
    .....
 }
}

Обратите внимание, что двойные подчеркивания важны, поскольку он указывает читателю переменных среды принимать this как свойство сложного объекта ClientConfiguration,Ваши пользовательские свойства должны находиться внутри объекта Values, иначе они не будут внедрены как переменные среды.

0 голосов
/ 17 октября 2018

Насколько я знаю, коллекция значений должна представлять собой словарь, если она содержит какие-либо нестроковые значения, это может привести к тому, что функция Azure не сможет прочитать значения из local.settings.json.Для более подробной информации, пожалуйста, обратитесь к блогу

...