运行.NET Core API Linux环境启动配置文件

时间:2018-10-18 22:59:41

标签: c# asp.net-core .net-core

因此,我尝试使用不同的环境设置运行.NET Core API应用程序。我一直在阅读文档,并且据我所知我已经按照说明进行操作。但是,当我在VS之外运行服务时,由于找不到连接字符串而使其崩溃。我显然缺少基本的东西。

我在launchSettings.json“开发”和“登台”中设置了两个配置文件

"profiles": {
  "IIS Express": {
    "commandName": "Project",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    }
  },
  "Development": {
    "commandName": "Project",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    }
  },
  "Staging": {
    "commandName": "Project",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Staging"
    }
  }

我有以下配置文件。

appsettings.json
appsettings.Development.json
appsettings.Staging.json

我的Startup.cs中也包含以下代码:

var builder = new ConfigurationBuilder()  
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
    .AddEnvironmentVariables();

Configuration = builder.Build();

调试时,我可以看到.AddJsonFile($"appsettings.{env.EnvironmentName}.json"正在加载预期的文件。但是,当我将其发布到目录并尝试运行它时,connectionString的值为null

appsettings.json不包含连接字符串的值。它位于两个依赖于环境的文件中,定义如下:

"DefaultConnection": {
    "ConnectionString":
        "Server=name;Port=3307;Database=name;User Id=name;Password=name;"
},

由于这一切都可以在VS中完成,因此我确信这都是正确的。但是,当我尝试运行它时,BOOM!

dotnet MyDll.dll --launch-profile Staging

我刚刚注意到--launch-profile仅适用于dotnet run,当我尝试运行该应用程序时,它正在寻找Production.json文件。如何仅使用dotnet命令而不使用dotnet run命令使用各种配置文件?

2 个答案:

答案 0 :(得分:2)

所以,经过一番摸索之后。看来您必须在服务器上设置环境变量,我误认为这是某种“运行时环境”变量,不是,它是完整的OS级环境变量:

LINUX

export ASPNETCORE_ENVIRONMENT =暂存

POWERSHELL

$ Env:ASPNETCORE_ENVIRONMENT =“分期”

WINDOWS

set ASPNETCORE_ENVIRONMENT =登台

答案 1 :(得分:0)

除了设置环境变量(AddEnvironmentVariables),还可以使用命令行(AddCommandLine),这是一个示例:

public static IHostBuilder CreateDefaultBuilder(string[] args)
{
    var hostBuilder = new HostBuilder()
        // ConfigureHostConfiguration is only for IHostingEnvironment currently
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                // e.g.: dotnet run --environment "Staging"
                config.AddCommandLine(args);
            }
        })
        .ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

            if (args != null)
            {
                builder.AddCommandLine(args);
            }
        });

    return hostBuilder;
}