.Net Core

时间:2019-02-04 17:32:59

标签: c# asp.net-core

我正在设置一个appsettings.json文件,以便在任何.net Core项目(Web,控制台和库)之间共享。 我按照本文https://andrewlock.net/sharing-appsettings-json-configuration-files-between-projects-in-asp-net-core/的步骤设置了共享文件,但无法在控制台项目中读取文件。

这是我尝试过的代码

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("SharedSettings.json", optional: true, 
            reloadOnChange: true);

        IConfigurationRoot configuration = builder.Build();

        Console.WriteLine("Connection string: " + configuration.GetConnectionString("DefaultConnection"));
        Console.WriteLine("Hello World!");
        Console.Write("Press any key to continue...");
        Console.ReadKey(true);
    }

这是我的项目结构

enter image description here

在我的项目网站中,读取文件的代码是,我需要在另一个项目中读取共享的.json。

  public static IWebHost BuildWebHost(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
     .UseContentRoot(Directory.GetCurrentDirectory())
     .ConfigureAppConfiguration((hostingContext, config) => {
      IHostingEnvironment env = hostingContext.HostingEnvironment;

  // find the shared folder in the parent folder
  var sharedFolder = Path.Combine(env.ContentRootPath, "..", "Shared");

  //load the SharedSettings first, so that appsettings.json overrwrites it
  config
   .AddJsonFile(Path.Combine(sharedFolder, "SharedSettings.json"), optional: true) // When running using dotnet run
   .AddJsonFile("SharedSettings.json", optional: true) // When app is published
   .AddJsonFile("appsettings.json", optional: true)
   .AddJsonFile($ "appsettings.{env.EnvironmentName}.json", optional: true);

  config.AddEnvironmentVariables();
 })
 .UseStartup < Startup > ()
 .Build();

1 个答案:

答案 0 :(得分:0)

没有您的ConfigurationBuilder实现以及如何将IConfiguration传递给依赖项。例如,它们是独立的应用程序吗?

对于其他应用程序,您可以通过执行以下操作来获得所需的结果:

  1. 在解决方案中的appsettings.json文件中,打开属性。
  2. 构建到输出目录。

当您在Visual Studio中时,应用程序应无任何问题地读取appsettings.json。对于我的解决方案,我创建了一个名为Configuration的目录,其中包含两个子目录Development和Production。现在,当Visual Studio生成时,它应该遵循上述配置,但是要创建一个单独的Build目录,该目录不属于bin,我使用了PowerShell脚本。

Param($configuration="Development")

if($configuration.ToUpper().StartsWith("P")) {
     $configuration="Production"
} else {
     $configuration="Development"
}

if((Test-Path .\Build)) {
     Remove-Item -r -fo .\Build
}

New-Item -ItemType Directory .\Build | Out-Null
dotnet publish --configuration Release --runtime win81-x64 --verbosity Quiet --self-contained true
Copy-Item -r .\bin\Release\netcoreapp2.1\win81-x64\publish\* .\Build\

Remove-Item .\Build\*.pdb
Remove-Item .\Build\appsettings.json

Copy-Item .\Configuration\$configuration\appsettings.json .\Build\
Copy-Item ".\Configuration\Deployment Resources\Script\*.ps1" .\Build\
Copy-Item ".\Configuration\Deployment Resources\Task\*.xml" .\Build\

echo "`n`n"
Write-Host "╭ ─────────────────────────── ╮"
Write-Host "         $configuration              "
Write-Host "╰ ─────────────────────────── ╯"
echo "`n`n"

要构建,我在命令行上导航到我的解决方案,只需执行:.\Build.ps1 Production.\Build.ps1,它将为我创建一个有效的Build目录。您可以忽略其他一些组件,因为它们是用于计划任务,安装脚本等的,因此我们还包括这些组件,因此当我们使用部署脚本时,所有组件都会转移到远程服务器。

一旦您提供有关其他项目如何链接到Web解决方案的更多信息,我将修改答案。