处理多个项目时的.NET Core 2.0 appsettings.json文件位置

And*_*ndr 5 .net-core

我正在开发一个由多个项目组成的.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中有一种更“正确”的方法可以做到这一点。在那儿?

And*_*ndr 7

我想通了是怎么回事。在launch.json 文件中,我没有为cwd 参数设置正确的路径。这就是 Startup() 在错误的位置寻找 appsettings.json 文件的原因。

  • 对于阅读本文的其他人...从 VSCode 运行项目时,“cwd”是“launch.json”中的一个选项!谢谢! (2认同)

Jul*_*iën 6

您可能已经知道,执行中的项目确定了它在哪里查找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,您还可以通过右键单击属性以可视方式进行配置。

注意:如果要在所有项目之间使用单个共享文件,则可能会发现此问题很有趣。