当文件显然应该存在时,为什么 JsonConfigurationSource 会抛出 FileNotFoundException?
Why does JsonConfigurationSource throw FileNotFoundException when file clearly ought to exist?
考虑以下 C# 代码:
var json = "{ \"LogLevel\": \"Debug\" }";
const string filePath = @"C:\temp\tempconfiguration.json";
File.WriteAllText(filePath, json);
var jsonConfigurationSource = new JsonConfigurationSource { Path = filePath };
var jsonConfigurationProvider = new JsonConfigurationProvider(jsonConfigurationSource);
var configuration = new ConfigurationRoot(new List<IConfigurationProvider> { jsonConfigurationProvider });
当我 运行 这个时,它抛出:
System.IO.FileNotFoundException
The configuration file 'C:\temp\tempconfiguration.json' was not found and is not optional.
这对我来说毫无意义。该文件显然存在(我可以在 Windows 资源管理器中看到它)。谁能向我解释这里发生了什么?提前致谢!
(我知道我也可以使用 JsonStreamConfigurationProvider
从流中读取,但我 希望 也能够从文件中读取配置。主要是因为JsonStreamConfigurationProvider
不支持 IConfigurationRoot.Reload
.)
我正在 运行宁 .NET 5.0 和 C# 9。
问题是 Path
是相对于 JsonConfigurationSource
的 FileProvider
。您可以显式设置 FileProvider
:
var jsonConfigurationSource = new JsonConfigurationSource { Path = Path.GetFileName(filePath) };
jsonConfigurationSource.FileProvider = new PhysicalFileProvider(Path.GetDirectoryName(filePath));
或者更简单的方法,调用 ResolveFileProvider
:
var jsonConfigurationSource = new JsonConfigurationSource { Path = filePath };
jsonConfigurationSource.ResolveFileProvider();
这将自动从您的绝对路径创建 FileProvider
并在之后使该路径成为相对路径(因此将为您执行与上述相同的操作)。
考虑以下 C# 代码:
var json = "{ \"LogLevel\": \"Debug\" }";
const string filePath = @"C:\temp\tempconfiguration.json";
File.WriteAllText(filePath, json);
var jsonConfigurationSource = new JsonConfigurationSource { Path = filePath };
var jsonConfigurationProvider = new JsonConfigurationProvider(jsonConfigurationSource);
var configuration = new ConfigurationRoot(new List<IConfigurationProvider> { jsonConfigurationProvider });
当我 运行 这个时,它抛出:
System.IO.FileNotFoundException
The configuration file 'C:\temp\tempconfiguration.json' was not found and is not optional.
这对我来说毫无意义。该文件显然存在(我可以在 Windows 资源管理器中看到它)。谁能向我解释这里发生了什么?提前致谢!
(我知道我也可以使用 JsonStreamConfigurationProvider
从流中读取,但我 希望 也能够从文件中读取配置。主要是因为JsonStreamConfigurationProvider
不支持 IConfigurationRoot.Reload
.)
我正在 运行宁 .NET 5.0 和 C# 9。
问题是 Path
是相对于 JsonConfigurationSource
的 FileProvider
。您可以显式设置 FileProvider
:
var jsonConfigurationSource = new JsonConfigurationSource { Path = Path.GetFileName(filePath) };
jsonConfigurationSource.FileProvider = new PhysicalFileProvider(Path.GetDirectoryName(filePath));
或者更简单的方法,调用 ResolveFileProvider
:
var jsonConfigurationSource = new JsonConfigurationSource { Path = filePath };
jsonConfigurationSource.ResolveFileProvider();
这将自动从您的绝对路径创建 FileProvider
并在之后使该路径成为相对路径(因此将为您执行与上述相同的操作)。