#azure #azure-functions #azure-functions-runtime #azure-functions-core-tools
#azure #azure-функции #azure-функции-среда выполнения #azure-функции-ядро-инструменты
Вопрос:
Как получить доступ к 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();
}
}
}
Ответ №1:
У вас нет 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"
}
Комментарии:
1. Но local.settings.json предназначен только для среды разработки, что, если я хочу использовать файл JSON для настроек в Azure или отдельный файл, такой как appsettings.json? Это особенно проблема при запуске функции внутри docker.
2. Я обновил свой ответ — будьте осторожны при установке определенных настроек, таких как secrets, в изображениях docker — см. medium.com/@mccode /…
3. Все секреты передаются в службу через Vault, поэтому ни один из них не добавляется к изображению. Позвольте мне попробовать решение, насколько я знаю, Directory.GetCurrentDirectory() не будет работать. Спасибо
4. На самом деле, мой код не работает в Azure… github.com/MicrosoftDocs/azure-docs/issues/26761 теперь мне любопытно 😉 Обновлю ответ снова через пару минут..
Ответ №2:
Используйте приведенный ниже код, у меня это сработало.
var executioncontextoptions = builder.Services.BuildServiceProvider()
.GetService<IOptions<ExecutionContextOptions>>().Value;
var currentDirectory = executioncontextoptions.AppDirectory;
configuration = configurationBuilder.SetBasePath(currentDirectory)
.AddJsonFile(ConfigFile, optional: false, reloadOnChange: true)
.Build();
Ответ №3:
Когда в документации указано, что в приложении функции по умолчанию используется %HOME%site wwwroot, это означает, что если вы не укажете эту переменную среды, узел функций будет использовать %HOME%site wwwroot.
public void Configure(IWebJobsBuilder builder)
{
var localRoot = Environment.GetEnvironmentVariable("AzureWebJobsScriptRoot");
var azureRoot = $@"{Environment.GetEnvironmentVariable("HOME")}sitewwwroot";
var config = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
.SetBasePath(localRoot ?? azureRoot )
.AddJsonFile("appsettings.json", true)
.AddJsonFile("local.settings.json", true)
.AddEnvironmentVariables()
.Build();
}