Как добавить значения конфигурации в AppSettings.json в функции Azure. Есть ли какая-то структура для этого?
Какая стандартная структура для добавления ключей appsettings.json
? Кроме того, как читать эти значения в нашем run.csx
? Обычно в app.config у нас было ConfigurationManager.GetSettings["SettingName"];
Есть ли похожая реализация в функции Azure?
3 ответа
В Azure Functions 2.x вам необходимо использовать стиль управления конфигурацией ядра.Net, содержащийся в пакете. Microsoft.Extensions.Configuration
, Это позволяет создать местный settings.json
файл на вашем компьютере разработчика для локальной конфигурации в Values
а также ConnectionString
часть файла JSON. local json
файл настроек не публикуется в Azure, и вместо этого Azure будет получать настройки из настроек приложения, связанных с функцией.
В коде вашей функции примите параметр типа Microsoft.Azure.WebJobs.ExecutionContext context
где вы можете построить IConfigurationRoot
поставщик:
[FunctionName("MyFunction")]
public static async Task Run([TimerTrigger("0 */15 * * * *")]TimerInfo myTimer,
TraceWriter log, Microsoft.Azure.WebJobs.ExecutionContext context,
CancellationToken ctx)
{
var config = ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
// This abstracts away the .json and app settings duality
var myValue = config["MyKey"];
var myConnString = config.GetConnectionString("connString");
... etc
AddJsonFile
позволяет добавить локальный конфигурационный файл разработки, например local.settings.json
содержит локальные значения dev (не опубликовано)
{
"IsEncrypted": false,
"Values": {
"MyKey": "MyValue",
...
},
"ConnectionStrings": {
"connString": "...."
}
Хотя, по-видимому, использование ConnectionStrings для чего-либо, кроме EF , не рекомендуется
После развертывания в Azure вы можете изменить значения параметров в функции "Параметры приложения":
Как указано здесь
Эти настройки также могут быть прочитаны в вашем коде как переменные среды. В C# используйте
System.Environment.GetEnvironmentVariable
или жеConfigurationManager.AppSettings
, В JavaScript используйтеprocess.env
, Параметры, указанные в качестве системной переменной среды, имеют приоритет над значениями вlocal.settings.json
файл.
Вам не нужно использовать System.Environment.GetEnvironmentVariable()
чтобы получить доступ к настройкам вашего приложения.
ConfigurationManager
доступно для функций Azure в run.csx примерно так:
System.Configuration.ConfigurationManager.AppSettings["SettingName"]
Для загрузки значения среды или настроек приложения вам необходимо использовать
System.Environment.GetEnvironmentVariable свойство
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
log.Info(GetEnvironmentVariable("AzureWebJobsStorage"));
log.Info(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}
public static string GetEnvironmentVariable(string name)
{
return name + ": " +
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}
Управление переменными параметров приложения - https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings
Вот как это можно настроить:
Шаг 1
Добавьте свой json в корень вашего репо, например app.settings.json
Шаг 2
Добавьте файл Diretory.Build.targets (здесь расширение.targets) следующим образом.
<Project>
<PropertyGroup>
<_IsFunctionsSdkBuild Condition="$(_FunctionsTaskFramework) != ''">true</_IsFunctionsSdkBuild>
<_FunctionsExtensionsDir>$(TargetDir)</_FunctionsExtensionsDir>
<_FunctionsExtensionsDir Condition="$(_IsFunctionsSdkBuild) == 'true'">$(_FunctionsExtensionsDir)bin</_FunctionsExtensionsDir>
</PropertyGroup>
<Target Name="CopyExtensionsJson" AfterTargets="_GenerateFunctionsAndCopyContentFiles">
<Message Importance="High" Text="Overwritting extensions.json file with one from build." />
<Copy Condition="$(_IsFunctionsSdkBuild) == 'true' AND Exists('$(_FunctionsExtensionsDir)\extensions.json')"
SourceFiles="$(_FunctionsExtensionsDir)\extensions.json"
DestinationFiles="$(PublishDir)bin\extensions.json"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"/>
</Target>
<Target Name="CopyVaultJson" AfterTargets="_GenerateFunctionsAndCopyContentFiles">
<Message Importance="High" Text="Overwritting app.settings.json file with one from build." />
<Copy Condition="$(_IsFunctionsSdkBuild) == 'true' AND Exists('$(_FunctionsExtensionsDir)\app.settings.json')"
SourceFiles="$(_FunctionsExtensionsDir)\app.settings.json"
DestinationFiles="$(PublishDir)bin\app.settings.json"
OverwriteReadOnlyFiles="true"
ContinueOnError="true"/>
</Target>
</Project>
Это явным образом скажет компилятору включить файл app.settings.json при запуске сборки dotnet и включит указанный файл в /bin, что позволит вашей dll получить к нему доступ.
Удачного кодирования.
Функции Azure поддерживают только ограниченную часть app.config
, Позволяет сохранить настройки приложения и соединения в local.settings.json
при запуске функции от VS. Он не поддерживает настройки конечной точки WCF под system.serviceModel
в этом файле JSON. У меня была ссылка на библиотеку dll в функции Azure, которая вызывала API-интерфейс WCF.
Странная вещь, которую я обнаружил, - когда я запускаю функцию Azure, она преобразует обратно конфигурацию json в xml по пути cli (%localappdata%\AzureFunctionsTools\Releases\1.6.0\cli\func.exe.config
). Я добавил свою конфигурацию xml (system.serviceModel
) к этому файлу конфигурации, и он работал нормально, выбирая мои конечные точки WCF для запуска служб. Хотя я боролся за использование конфигурации log4net, но я хорошо запускаю API.
Azure должен был поддерживать файлы конфигурации xml напрямую. Надеюсь это поможет.
Настройки приложений управляются не самой функцией, а ее приложением-функцией. Так что, если вы используете Cli, что-то вместе...
az functionapp appsettings set .....
Вот как я это делаю в своем конвейере CI/CD. После этого вы можете использовать их в своих функциях. Помните, что функция ДОЛЖНА жить в приложении Function, поэтому имеет смысл поместить все эти значения туда, чтобы они были доступны в каждой функции.