ExecutionContext в реализации функции Azure IWebJobsStartup

Как получить доступ к ExecutionContext.FunctionAppDirectory в классе запуска функций, чтобы я мог правильно настроить свою конфигурацию. См. следующий код запуска:

[assembly: WebJobsStartup(typeof(FuncStartup))]
namespace Function.Test
{
    public class FuncStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            var config = new ConfigurationBuilder()
               .SetBasePath(“”/* How to get the Context here. I cann’t DI it 
                           as it requires default constructor*/)
               .AddJsonFile(“local.settings.json”, true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .Build();

        }
    }
 }
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
16
0
5 934
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

У вас нет ExecutionContext, так как ваша Функция Azure еще не обрабатывает фактический вызов функции. Но вам это тоже не нужно — local.settings.json автоматически разбирается в переменные окружения.

Если вам действительно нужен каталог, вы можете использовать %HOME%/site/wwwroot в Azure и AzureWebJobsScriptRoot при локальном запуске. Это эквивалент FunctionAppDirectory.

Этот также является хорошим обсуждением этой темы.

    public void Configure(IWebJobsBuilder builder)
    {
        var local_root = Environment.GetEnvironmentVariable("AzureWebJobsScriptRoot");
        var azure_root = $"{Environment.GetEnvironmentVariable("HOME")}/site/wwwroot";

        var actual_root = local_root ?? azure_root;

        var config = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
            .SetBasePath(actual_root)
            .AddJsonFile("SomeOther.json")
            .AddEnvironmentVariables()
            .Build();

        var appInsightsSetting = config.GetSection("APPINSIGHTS_INSTRUMENTATIONKEY");
        string val = appInsightsSetting.Value;
        var helloSetting = config.GetSection("hello");
        string val = helloSetting.Value;

        //...
    }

Пример local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "APPINSIGHTS_INSTRUMENTATIONKEY": "123456..."
  }
}

Пример SomeOther.json

{
  "hello":  "world"
}

Но local.settings.json предназначен только для среды разработки. Что, если я хочу использовать файл JSON для настроек в Azure или отдельный файл, например appsettings.json? Это особенно проблема при запуске функции внутри докера.

Soma Yarlagadda 10.04.2019 20:19

Я обновил свой ответ - будьте осторожны с размещением определенных настроек, таких как секреты, в образах докеров - см. medium.com/@mccode/…

Alex AIT 10.04.2019 20:49

Все секреты передаются сервису через Vault, поэтому ни один из них не добавляется в образ. Позвольте мне попробовать решение, насколько я знаю, Directory.GetCUrrentDirectory() не будет работать. Спасибо

Soma Yarlagadda 10.04.2019 20:52

На самом деле, мой код не работает в Azure... github.com/MicrosoftDocs/azure-docs/issues/26761 теперь мне любопытно ;-) Через пару минут снова обновлю ответ..

Alex AIT 10.04.2019 20:58

Используйте приведенный ниже код, это сработало для меня.

var executioncontextoptions = builder.Services.BuildServiceProvider()
         .GetService<IOptions<ExecutionContextOptions>>().Value;

var currentDirectory = executioncontextoptions.AppDirectory;

configuration = configurationBuilder.SetBasePath(currentDirectory)
          .AddJsonFile(ConfigFile, optional: false, reloadOnChange: true)    
          .Build();

Когда в документации говорится, что в приложении-функции по умолчанию используется %HOME%\site\wwwroot, это означает, что если вы не укажете эту переменную среды, узел функций будет использовать %HOME%\site\wwwroot.

public void Configure(IWebJobsBuilder builder)
    {
        var localRoot = Environment.GetEnvironmentVariable("AzureWebJobsScriptRoot");
        var azureRoot = $@"{Environment.GetEnvironmentVariable("HOME")}\site\wwwroot";

        var config = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
            .SetBasePath(localRoot ?? azureRoot )
            .AddJsonFile("appsettings.json", true)
            .AddJsonFile("local.settings.json", true)
            .AddEnvironmentVariables()
            .Build();            
    }

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