【发布时间】:2021-08-29 19:16:25
【问题描述】:
我在一个 Visual Studio 解决方案中有一个 .net 5 ASP.NET Core Web API 和一个控制台应用程序。我的 API 宿主项目中有一个 appsettings.json 文件,我想在我的控制台应用程序中引用该文件。该文件有Copy if newer 对应Copy to Output Directory。
解决方案结构如下(不相关项目略):
- 解决方案
- ApiHostProject
- appsettings.json
- ConsoleAppProject
- ApiHostProject
这是我的控制台应用程序的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'.
无论控制台应用是通过 Visual Studio 还是 dotnet run 命令运行,您能否帮我让控制台应用找到 API 主机的 appsettings.json?
【问题讨论】:
-
你听说过 Directory.Build.props 吗? Good Example。在那里,您可以为解决方案中的一组项目指定任何类型的项目属性。
-
@Martin 谢谢,非常方便。你能看看我关于连接字符串的最后一个问题(作为对这篇文章的回答)吗?
标签: c# asp.net-web-api console-application projects-and-solutions appsettings