如何设置ASPNETCORE_ENVIRONMENT以考虑发布asp.net核心应用程序?


109

当我将asp.net核心Web应用程序发布到本地文件系统时,它始终采用production-config和ASPNETCORE_ENVIRONMENT变量,其值为=“ Production”。

我必须如何以及在何处设置ASPNETCORE_ENVIRONMENT变量的值,以便不仅可以将其用于调试,还可以将其用于发布?我已经尝试了以下选项,但没有成功:

  • 在Windows设置中
  • 在.pubxml文件中
  • 在launchSettings.json中
  • 在project.json中



1
stackoverflow.com/questions/43493259/…这有2个检查实际错误的选项。
Kurkula

Answers:


90

除上述选项外,还有其他一些解决方案。

1.修改项目文件(.CsProj)文件

MSBuild支持该EnvironmentName属性,该属性可以帮助根据您希望部署的环境设置正确的环境变量。环境名称将在发布阶段添加到web.config中。

只需打开项目文件(* .csProj)并添加以下XML。

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

上面的代码将为DevelopmentDebug配置或未指定配置添加环境名称。对于任何其他配置,环境名称将Production在生成的web.config文件中。在这里更多细节

2.在发布配置文件中添加EnvironmentName属性。

我们也可以<EnvironmentName>在发布配置文件中添加该属性。打开位于该位置的发布配置文件。Properties/PublishProfiles/{profilename.pubxml}这将在发布项目时在web.config中设置环境名称。此处有更多详细信息

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3.使用dotnet publish的命令行选项

另外,我们可以将该属性EnvironmentName作为命令行选项传递给dotnet publish命令。接下来的命令将包含Developmentweb.config文件中的环境变量。

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


7
据我所知,这似乎是最好的答案。每个发布配置文件设置它的功能确实帮了我很多。
乔纳森·昆斯

第三种选择对我有用。您知道/ p:EnvironmentName选项是否在dotnet文档中的任何地方提及?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development正是我想要的。谢谢!
Matt M

如果有人想发布到UAT,QA或Production,请问完整的“ .net发布...”是什么?
crazyTech

75

选项1:

要在Windows中设置ASPNETCORE_ENVIRONMENT环境变量,

命令行 - setx ASPNETCORE_ENVIRONMENT "Development"

电源外壳 - $Env:ASPNETCORE_ENVIRONMENT = "Development"

对于其他操作系统,请参考此-https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments

选项2:

如果您要使用来设置ASPNETCORE_ENVIRONMENT,web.config则可以aspNetCore这样添加-

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

42
这两个都是可怕的选择。1)为整个操作系统设置此设置,我想在IIS中的每个站点设置它。2)AspNet Core不支持web.config转换。您如何建议修改web.config以进行部署?
库格尔


5
一旦遇到更好的选择...请在此处分享:)
桑凯特(Sanket)

5
这种配置设计看起来很凌乱。
koo9

2
您可以在多个环境的发布配置文件中覆盖它。
cederlof

31

在Visual Studio IDE中进行设置的简单方法。

项目>属性>调试>环境变量

在此处输入图片说明


3
但是随后您需要记住,每次需要发布到其他环境时都要进行更改。
Alisson

15
那是不对的。仅在运行IDE时有效。将其存储在launchsettings.json文件中,该文件是Visual Studio的东西。不适用于部署。
onefootswill

21

您应该遵循的文档中提供的说明,使用web.config

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

请注意,您还可以设置其他环境变量。

ASP.NET Core模块允许您通过在aspNetCore元素下的environmentVariables集合元素的一个或多个environmentVariable子元素中指定它们来为processPath属性中指定的过程指定环境变量。本节中设置的环境变量优先于该过程的系统环境变量。


如何在.net核心控制台应用程序中进行设置?
user441365 '18

通过Windows的“环境变量”对话框进行设置。
大卫·派恩

1
但是,是否可以在项目中而不是在OS中进行设置?
user441365 '18

不适用于我知道的.NET Core中的控制台应用程序...不-也许这-stackoverflow.com/a/46445432/2410379吗?
大卫·派恩

15

这是我们可以在运行时设置的方式:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

不知道为什么这是不赞成的,因为这是唯一对我有用的东西。
pcalkins

1
由于代码中的硬编码值,因此很可能被否决了。
凯文

测试最快,但我同意长期以来我不想看到的已签入代码。
Brett Rigby

尽管这是硬编码的,但我认为这是最简单的方法。
即将于

1
我的首选方法是将它与DEBUG结合使用以设置正确的值。
Dave de Jong

6

使用最新版本的dotnet cli(2.1.400或更高版本),您可以设置此msbuild属性,$(EnvironmentName)并且发布工具将负责使用环境名称将ASPNETCORE_ENVIRONMENT添加到web.config中。

另外,从2.2.100-preview1开始提供XDT支持。

样本:https : //github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
您能否详细说明you can just set this msbuild property $(EnvironmentName) and publish或提供参考?
DanElliott

1
如何在.net核心控制台应用程序中进行设置?
user441365 '18

6
  1. 创建您的appsettings。*。json文件。(示例:appsettings.Development.json,appsettings.Staging.json,appsettings.Production.json)

  2. 将变量添加到这些文件。

  3. 像通常那样为每个环境创建一个单独的发布配置文件。

  4. 打开PublishProfiles / Development.pubxml(命名将基于您命名的Publish Profile)。

  5. 只需将一个标签添加到PublishProfile来设置EnvironmentName变量,其余的操作就是appsettings。*。json文件命名约定。

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>

参考:https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

请参阅“设置环境”部分。


3

此变量可以保存在json中。例如带有以下内容的envsettings.json

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

稍后按如下方式修改program.cs

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

这样,它将始终包含在发布中,并且您可以根据托管网站的环境将其更改为所需的值。由于更改在Program.cs中,因此也可以在控制台应用程序中使用此方法。


0

通过直接在Azure platorm上设置此变量(如果使用它),我发现它对我有用。只需选择您的Web应用程序->配置->应用程序设置,然后添加变量及其值,然后按保存按钮即可。


0

为了在每个站点上设置环境,我们在项目中使用的另一个选项是将Parameters.xml文件添加到项目中,其内容如下:

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

该文件的“生成操作”为“ 内容”,“复制操作”为“ 复制如果较新”,则它将成为要部署的软件包的一部分。

然后,要部署程序包并设置环境,请在发行版中的“ WinRM-IIS Web App Deployment”任务下(它在使用“ IIS Web App deploy”任务时同样有效)下,为msdeploy设置其他参数:

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

这样,我们可以拥有多个版本,所有版本都使用相同的工件,但是部署为不同的环境。


0

我知道这是一篇过时的文章,但由于没有人建议,我认为我会将简单的解决方案加入其中。

我使用当前目录确定当前环境,然后翻转连接字符串和环境变量。只要您对站点文件夹(如test / beta / sandbox)有一个命名约定,此方法就很好用。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.