ОК, теперь у меня все работает :) Поскольку мы используем развертывание осьминога, нам не нужны несколько файлов конфигурации, поэтому у нас есть только один appsettings.Release.json файл, в который подставляются значения на основе среда разворачивается тоже.
Ниже приведен основной код функции.
public static class Function
{
// Format in a CRON Expression e.g. {second} {minute} {hour} {day} {month} {day-of-week}
// https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer
// [TimerTrigger("0 59 23 * * *") = 11:59pm
[FunctionName("Function")]
public static void Run([TimerTrigger("0 59 23 * * *")]TimerInfo myTimer, ILogger log)
{
// If running in debug then we dont want to load the appsettings.json file, this has its variables substituted in octopus
// Running locally will use the local.settings.json file instead
#if DEBUG
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
#else
IConfiguration config = Utils.GetSettingsFromReleaseFile();
#endif
// Initialise dependency injections
var serviceProvider = Bootstrap.ConfigureServices(log4Net, config);
var retryCount = Convert.ToInt32(config["RetryCount"]);
int count = 0;
while (count < retryCount)
{
count++;
try
{
var business = serviceProvider.GetService<IBusiness>();
business.UpdateStatusAndLiability();
return;
}
catch (Exception e)
{
// Log your error
}
}
}
}
Файл Utils.cs выглядит следующим образом
public static class Utils
{
public static string LoadSettingsFromFile(string environmentName)
{
var executableLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// We need to go back up one level as the appseetings.Release.json file is not put in the bin directory
var actualPathToConfig = Path.Combine(executableLocation, $"..\\appsettings.{environmentName}.json");
using (StreamReader reader = new StreamReader(actualPathToConfig))
{
return reader.ReadToEnd();
}
}
public static IConfiguration GetSettingsFromReleaseFile()
{
var json = Utils.LoadSettingsFromFile("Release");
var memoryFileProvider = new InMemoryFileProvider(json);
var config = new ConfigurationBuilder()
.AddJsonFile(memoryFileProvider, "appsettings.json", false, false)
.Build();
return config;
}
}
appsettings.Release.json установлен как Содержимое и Копировать всегда в visual studio. Похоже, это
{
"RetryCount": "#{WagonStatusAndLiabilityRetryCount}",
"RetryWaitInSeconds": "#{WagonStatusAndLiabilityRetryWaitInSeconds}",
"DefaultConnection": "#{YourConnectionString}"
}
На самом деле, я думаю, что вы могли бы уже иметь файл appsettings.config и пропустить файл appsettings.Release.json, но это работает, и вы можете делать с ним все, что хотите.