Azure函数,如何具有多个.json配置文件

时间:2019-06-05 08:45:22

标签: c# azure azure-functions asp.net-core-2.0

所以我写了一个在本地工作的Azure函数。我认为这归结于拥有local.setting.json文件。但是,当我将其发布为天蓝色时,该功能无法正常工作,因为它无法找到我定义的设置值。来自Web应用程序和控制台驱动的方法,我们将拥有与每个环境相关联的不同配置文件。如何使它工作,这样我可以拥有多个settings.json文件,例如一个适合开发人员,雄鹿和产品环境?最终结果是使用octopus deploy进行部署,但是,如果此时我无法通过publish进行部署,则没有机会这样做。

我很困惑为什么不容易获得此信息,因为这是一件很常见的事情?

3 个答案:

答案 0 :(得分:1)

此文档的description关于local.settings.json

  

默认情况下,当   项目已发布到Azure。

一种方法是使用--publish-local-settings

  

将local.settings.json中的设置发布到Azure,提示   如果设置已经存在,则覆盖。

另一种方法是使用Manage Application Settings Remote 是Azure功能应用程序中的当前设置。或选择添加设置以创建新的应用程序设置。有关详细信息,请参考以下文档:Function app settings

enter image description here

答案 1 :(得分:1)

我希望看到功能以与asp.net核心或控制台应用程序相同的方式支持特定于环境的设置。同时,我正在使用下面的代码,这有点hacky(请参阅注释)。

2

答案 2 :(得分:1)

好的,现在我可以使用它了:)因为我们使用章鱼部署,所以我们不需要多个配置文件,所以只有一个 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文件,但是此方法可以正常工作,您现在可以使用它来做您想做的事情。