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

将函数部署到azure时无法加载appsettings.json文件,azure,azure-web-app-service,azure-functions,Azure,Azure Web App Service,Azure Functions,我正在azure function应用程序上工作,该应用程序引用了核心文件夹中的另一个项目,该项目包含以下类 在本文中,我尝试读取appsettings.json文件,它在本地工作正常,但当它部署到azure portal时,它找不到该文件,builder.Build()方法抛出FileNotFoundException public static class ConfigurationSettings { public static IConfigurationRoot GetConf

我正在azure function应用程序上工作,该应用程序引用了核心文件夹中的另一个项目,该项目包含以下类

在本文中,我尝试读取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 function应用程序中是否还有其他文件

在Azure中执行函数时,
GetCurrentDirectory
设置为
D:\Windows\system32
。该文件夹中没有
appsettings.json
,因此存在异常

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


当然,一定要将
appsettings.json
发布到Azure,作为部署的一部分。

在Azure中执行函数时,
GetCurrentDirectory
设置为
D:\Windows\system32
。该文件夹中没有
appsettings.json
,因此存在异常

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


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

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

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

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

这对我来说很有效,但仍在寻找更好的方法。

不是回答,而是更多的提示。不要使用
appsettings.json
文件加载应用程序的配置值。使用可用的适当功能,如
ConfigurationManager
,并使用应用程序设置,这些设置可以手动设置,也可以通过一些部署工具(如VST)设置。我创建了一个自定义提供程序,之后我开始出错“未找到配置文件'appsettings.json',该文件不是可选文件。物理路径为“D:\Program Files(x86)\SiteExtensions\Functions\1.0.11388\appsettings.json”。“它正在查找azure门户中执行代码的文件,但我认为它在内容根目录中查找该文件。如果它是正常的.net核心项目,我可以使用IhostingEnvironment来实现,但不确定它是否能在function app中工作。@Jan_V我知道我们不应该使用appsettings.json文件,但问题是我的项目没有任何启动类,要绑定一些项目设置,这是我现在唯一能想到的方法。不是anser,但更多的是提示。不要使用
appsettings.json
文件加载应用程序的配置值。使用可用的适当功能,如
ConfigurationManager
,并使用应用程序设置,这些设置可以手动设置,也可以通过一些部署工具(如VST)设置。我创建了一个自定义提供程序,之后我开始出错“未找到配置文件'appsettings.json',该文件不是可选文件。物理路径为“D:\Program Files(x86)\SiteExtensions\Functions\1.0.11388\appsettings.json”。“它正在查找azure门户中执行代码的文件,但我认为它在内容根目录中查找该文件。如果它是正常的.net核心项目,我可以使用IhostingEnvironment实现,但不确定它是否能在函数应用程序中工作。@Jan_V我知道我们不应该使用appsettings.json文件,但问题是我的项目没有任何启动类,要绑定一些项目设置,这是我现在唯一能想到的方法。appsettings.json是我的函数应用程序的一部分,它执行run方法,但我正在从另一个类库加载appsettings.json文件。一旦我将功能应用程序发布到azure,所有文件和文件夹都将被复制,包括所有引用,如果我从门户下载内容,我可以看到文件,但我仍然不知道appsettings.json的路径是什么,一旦复制到azure,我不确定是否可以为此文件设置一些修复路径。我想我知道了,您的回答对我很有用,只是又传递了一个参数ExecutionContext来运行方法,然后我使用FunctionDirectory属性来检索文件位置。如果您复制appsettings.json文件,您应该使用
FunctionAppDirectory
propertyappsettings.json是我的函数应用程序的一部分,它执行run方法,但我正在从另一个类库加载appsettings.json文件。一旦我将功能应用程序发布到azure,所有文件和文件夹都将被复制,包括所有引用,如果我从门户下载内容,我可以看到文件,但我仍然不知道appsettings.json的路径是什么,一旦复制到azure,我不确定是否可以为此文件设置一些修复路径。我想我知道了,您的回答对我很有用,只是又传递了一个参数ExecutionContext来运行方法,然后我使用FunctionDirectory属性来检索文件位置。如果您复制appsettings.json文件,您应该使用
FunctionAppDirectory
属性