Как добавить значения конфигурации в 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, поэтому имеет смысл поместить все эти значения туда, чтобы они были доступны в каждой функции.

Другие вопросы по тегам