我正在开发一个由多个项目组成的.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
Run Code Online (Sandbox Code Playgroud)
我很难弄清楚每个appsettings.json文件必须去哪里以及如何读入它们。我从阅读其他文章中假定,我应该将每个项目的appsettings.json文件自动复制到其关联bin\Debug目录中。如果是这样,我不确定如何使用Startup构造函数。我的理解是,这是.NET Core 2.0从appsettings.json文件读取值的方式:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
string myString = Configuration["blah:blah:blah"];
Run Code Online (Sandbox Code Playgroud)
configuration似乎是从而c:\code\my_big_solution不是我要从其提取的c:\code\my_big_solution\project1\bin\Debug任何项目Debug目录中获取其appsettings.json文件。
除了执行.NET Core 1.x的某种方式之外,我无法弄清楚如何从所需的目录中提取内容,这是通过更改构造函数,以便它传入an IHostingEnvironment并使用a ConstructorBuilder:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath ) // This line is wrong, but the correct path would be set here
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
string myString = Configuration["blah:blah:blah"];
Run Code Online (Sandbox Code Playgroud)
尽管第二种解决方案可以工作,但这使我感到烦恼,因为我认为在.NET Core 2.0中有一种更“正确”的方法可以做到这一点。在那儿?
我想通了是怎么回事。在launch.json 文件中,我没有为cwd 参数设置正确的路径。这就是 Startup() 在错误的位置寻找 appsettings.json 文件的原因。
您可能已经知道,执行中的项目确定了它在哪里查找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>
Run Code Online (Sandbox Code Playgroud)
在您的IDE中,例如Visual Studio或JetBrains Rider,您还可以通过右键单击属性以可视方式进行配置。
注意:如果要在所有项目之间使用单个共享文件,则可能会发现此问题很有趣。
| 归档时间: |
|
| 查看次数: |
7261 次 |
| 最近记录: |