在部署到azure的函数时无法加载appsettings.json文件

时间:2017-12-13 02:53:18

标签: azure azure-web-sites azure-functions

我正在研究azure功能应用程序,它引用了核心文件夹中的另一个项目,该项目包含以下类。

在这里我试图读取appsettings.json文件并且它在本地工作正常但是当它部署到azure portal时它找不到这个文件而builder.Build()方法抛出FileNotFoundException。

public static class ConfigurationSettings
{
    public static IConfigurationRoot GetConfigurationRoot()
    {

        var builder = new ConfigurationBuilder()
                        .SetBasePath(Directory.GetCurrentDirectory())
                        .AddJsonFile("appsettings.json");

        return builder.Build();
    }
}

任何人都可以建议我在这里做错了什么,还有其他任何在azure功能应用中包含文件吗?

2 个答案:

答案 0 :(得分:4)

当功能在Azure中执行时,GetCurrentDirectory设置为D:\Windows\system32。该文件夹中没有appsettings.json,因此例外。

我希望您能够设置库加载设置的目录。如果是这样,您应该为类型ExecutionContext的函数添加一个额外的参数,并使用其FunctionDirectory属性。请参阅docs

当然,请确保在部署过程中将appsettings.json发布到Azure。

答案 1 :(得分:0)

我现在可以运行功能应用程序并读取appsettings.json文件。这是我如何实现这个目标:

创建自定义配置提供程序CustomConfigurationProvider,将类型分配给静态属性SettingsType以及类库项目中的嵌入式appsettings.json文件:

public class CustomConfigurationProvider : ConfigurationProvider, IConfigurationSource
{
    public static Type SettingsType;
    public override void Load()
    {
        var JsonString = GetResponse("appsettings.json");
        var jsonObject =  JObject.Parse(JsonString);
        foreach (var settingsGroup in jsonObject)
        {
            var settingsGroupName = settingsGroup.Key;
            foreach (var setting in settingsGroup.Value)
            {
                var jProperty = setting as JProperty;
                Data.Add($"{settingsGroupName}:{jProperty.Name.ToString()}", jProperty.Value.ToString());
            }
        }
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return this;
    }

    protected string GetResponse(string resourceName)
    {
        var assembly = SettingsType.Assembly;
        var resourceStream = assembly.GetManifestResourceStream(SettingsType.Namespace+'.'+ "appsettings.json");
        using (var reader = new StreamReader(resourceStream, Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }
}

它对我有用,但仍在寻找一些更好的方法。