我在一个 Visual Studio 解决方案中有一个 .net 5 ASP.NET Core Web API 和一个控制台应用程序。我的 API 宿主项目中有一个appsettings.json文件,我想在控制台应用程序中引用该文件。该文件具有Copy if newer. Copy to Output Directory解决方案结构如下(不相关项目略):
- 解决方案
- ApiHost项目
- 应用设置.json
- ConsoleApp项目
- ApiHost项目
这是我的控制台应用程序Program.cs:
public class Program
{
public static Task Main(string[] args) => CreateHostBuilder(args).Build().RunAsync();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) => services.AddStockUpdater());
}
扩展方法AddStockUpdater,我在其中添加控制台应用程序的依赖项:
internal static IServiceCollection AddStockUpdater(this IServiceCollection services)
{
var netFolder = Directory.GetCurrentDirectory();
var debugFolder = Directory.GetParent(netFolder).FullName;
var binFolder = Directory.GetParent(debugFolder).FullName;
var consoleAppFolder = Directory.GetParent(binFolder).FullName;
var solutionFolder = Directory.GetParent(consoleAppFolder).FullName;
var pathToFile = Path.Combine(solutionFolder, "StockTradingSimulator.ApiHost", "appsettings.json");
var configuration = new ConfigurationBuilder()
.AddJsonFile(pathToFile, false)
.Build();
//URL of the Web API
services.AddHttpClient("trading", client => client.BaseAddress = new Uri("http://localhost:4000"));
return services
.AddSingleton(configuration)
.Configure<AppSettings>(configuration.GetSection("AppSettings"))
// other dependencies omitted
}
如果我将 API 主机和控制台应用程序设置为启动项目并通过 Visual Studio(通过“开始”按钮或Ctrl+ 5)运行它们,则此方法有效。但是,pathToFile如果"C:\\Users\\UserName\\Desktop\\SolutionFolder\\StockTradingSimulator.ApiHost\\appsettings.json"
我使用dotnet run(从包含控制台应用程序项目文件的目录,或从另一个目录将项目文件的路径作为--project参数dotnet run)运行控制台应用程序项目,我会收到错误消息:
System.IO.FileNotFoundException: The configuration file 'StockTradingSimulator.ApiHost\appsettings.json' was not found and is not optional. The physical path is 'C:\Users\StockTradingSimulator.ApiHost\appsettings.json'.
appsettings.json无论控制台应用程序是通过 Visual Studio 还是命令运行,您能否帮助我让控制台应用程序找到 API 主机dotnet run?