我正在研究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功能应用中包含文件吗?
答案 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();
}
}
}
它对我有用,但仍在寻找一些更好的方法。