我正在使用由多个项目组成的.NET Core 2.1.103 WebAPI应用程序。每个项目都需要有自己的appsettings.json文件。每个项目都在一个主要的解决方案中的自己的子目录中。夹。这是目录结构的简化版本,其中包含我的问题的相关目录:
c:\code\my_big_solution
c:\code\my_big_solution\project1
c:\code\my_big_solution\project1\bin\Debug
c:\code\my_big_solution\project2
c:\code\my_big_solution\project2\bin\Debug
c:\code\my_big_solution\project3
c:\code\my_big_solution\project3\bin\Debug
我很难弄清楚每个appsettings.json文件必须去哪里以及如何阅读它们。我在阅读其他帖子时假设我应该自动将每个项目的appsettings.json文件复制到其关联的{{ 1}}目录。如果是这种情况,我不确定如何使用Startup构造函数。我的理解是,这是从appsettings.json文件中读取值的.NET Core 2.0方法:
bin\Debug
public Startup(IConfiguration configuration)
{
Configuration = configuration;
string myString = Configuration["blah:blah:blah"];
似乎从configuration
获取了appsettings.json文件,而不是c:\code\my_big_solution
或我要从中提取的任何项目c:\code\my_big_solution\project1\bin\Debug
目录。< / p>
我无法弄清楚如何从所需的目录中提取,除了执行.NET Core 1.x之类的方式之外,还可以通过更改构造函数来实现这一目标&#39 ;传递Debug
并使用IHostingEnvironment
:
ConstructorBuilder
虽然第二种解决方案可行,但这让我感到困惑,因为我认为还有更多正确的解决方案。在.NET Core 2.0中执行此操作的方法。有吗?
答案 0 :(得分:4)
我弄清楚发生了什么事。在launch.json文件中,我没有为cwd参数设置正确的路径。这就是为什么Startup()在错误的地方寻找appsettings.json文件的原因。
答案 1 :(得分:3)
您可能已经意识到,正在执行的项目决定了它在appsettings.json文件中的位置。
这意味着默认情况下,在ASP.NET Core 2项目中,WebHost.CreateDefaultBinder从该项目的执行项目内容根目录加载appsettingsjson。
如果您的其他项目是类库,那么为每个项目设置单独的appsettings.json将不起作用。只有一个可执行程序,比如你提到的WebAPI项目,它将从它自己的根文件夹中读取它。
但是,如果你的所有项目都是可执行文件,那么只需在每个项目的根目录中添加appsettings.json文件,只需通过.csproj设置它们就可以自动将它们复制到输出文件夹中:
<ItemGroup>
<Content Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
在IDE中,如Visual Studio或JetBrains Rider,您也可以通过右键单击属性来直观地配置它。
N.B。如果要在所有项目之间使用单个共享文件,可能会感兴趣this question。