当文件显然应该存在时,为什么 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 是相对于 JsonConfigurationSourceFileProvider。您可以显式设置 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 并在之后使该路径成为相对路径(因此将为您执行与上述相同的操作)。