【问题标题】:Could not load the appsettings.json file when function deployed to azure将函数部署到 azure 时无法加载 appsettings.json 文件
【发布时间】:2017-12-14 16:54:50
【问题描述】:

我正在开发 azure 函数应用程序,它从核心文件夹中引用另一个项目,并且该项目包含以下类。

在此我试图读取 appsettings.json 文件,它在本地运行良好,但是当它部署到 azure 门户时,它找不到该文件并且 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 函数应用程序中包含文件的方法吗?

【问题讨论】:

  • 不是分析器,而是更多的提示。不要使用appsettings.json 文件为您的应用程序加载配置值。使用可用的适当功能,如 ConfigurationManager 并使用应用程序设置,这些设置可以手动设置,也可以通过某些部署工具(如 VSTS)
  • 我创建了一个自定义提供程序,之后我开始收到错误“找不到配置文件 'appsettings.json' 并且不是可选的。物理路径是 'D:\Program Files (x86) \SiteExtensions\Functions\1.0.11388\appsettings.json'。”它正在寻找在天蓝色门户中执行代码的文件,但我认为它在内容根目录中寻找文件。如果它是正常的 .net 核心项目,我可以使用 IhostingEnvironment 实现,但不确定它是否适用于功能应用程序。
  • @Jan_V 我知道我们不应该使用 appsettings.json 文件,但问题是我的项目没有任何启动类并且绑定一些项目设置这是我能想到的唯一方法现在。

标签: azure azure-web-app-service azure-functions


【解决方案1】:

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

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

当然,请务必将 appsettings.json 作为部署的一部分发布到 Azure。

【讨论】:

  • appsettings.json 是我的函数应用程序的一部分,它执行 run 方法,但我正在从另一个类库加载 appsettings.json 文件。一旦我发布了功能性应用程序以复制所有文件和文件夹,包括所有引用,如果我从门户下载内容,我可以看到文件,但我仍然不知道 appsettings.json 的路径在复制后可能是什么到天蓝色,我不确定是否可以为此文件设置一些修复路径。
  • 我想我明白了,你的答案对我有用,只是再传递一个参数 ExecutionContext 来运行方法,然后我使用 FunctionDirectory 属性来检索文件位置。
  • 如果你复制appsettings.json文件,你应该使用FunctionAppDirectory属性
【解决方案2】:

我现在可以运行函数应用并读取 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();
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2020-02-08
    相关资源
    最近更新 更多