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

Dar*_*rio 77 environment-variables production-environment asp.net-core

当我将我的asp.net核心Web应用程序发布到我的本地文件系统时,它总是需要使用value ="Production"的production-config和ASPNETCORE_ENVIRONMENT变量.

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

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

San*_*ket 50

选项1:

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

命令行 - setx ASPNETCORE_ENVIRONMENT "Development"

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

对于其他操作系统,请参阅此 - https://docs.microsoft.com/en-us/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>
Run Code Online (Sandbox Code Playgroud)

  • 这两个都是可怕的选择.1)为整个操作系统设置这个,我喜欢它在IIS中的每个站点.2)AspNet Core不支持web.config转换.您如何建议修改web.config以进行部署? (35认同)
  • 这种配置设计看起来很乱. (5认同)
  • 一旦你遇到更好的选择...请在这里分享:) (4认同)
  • 官方文档没有提供更好的选择;-) (2认同)
  • ASPNETCORE_ENVIRONMENT 的想法是,您可以使用 docker,并且只有一个 docker 运行一个 IIS。另一方面,我认为 ASP net core 如果你使用 Web.Config,你应该手动进行转换。 (2认同)
  • 您可以在多个环境的发布配置文件中覆盖它。 (2认同)

Abh*_*dha 46

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

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 据我所知,这似乎是最好的答案。每个发布配置文件设置它的功能确实对我有很大帮助。 (5认同)
  • 我正在寻找`dotnet publish -c调试-r win-x64 / p:EnvironmentName = Development`。谢谢! (4认同)
  • 第三个选项对我有用。您知道 dotnet 文档中是否提到了 /p:EnvironmentName 选项? (2认同)

Mar*_*eio 26

在visual studio IDE中设置它的简单方法.

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

在此输入图像描述

  • 那不对.这仅在运行IDE时有效.将它存储在launchsettings.json文件中,这是一个Visual Studio的东西.不适用于部署. (9认同)
  • 但是,每当您需要发布到不同的环境时,您需要记住更改此内容. (3认同)
  • 这仅对于手动构建就足够了。 (2认同)

Mig*_*ill 24

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

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 由于代码中的硬编码值,它很可能被否决。 (4认同)
  • 不知道为什么这被否决了,因为这是唯一对我有用的东西。 (3认同)
  • 我的首选方法是与 DEBUG 结合使用来设置正确的值。 (3认同)

eli*_*oxy 17

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

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

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

  4. 打开PublishProfiles/Development.pubxml文件(命名将基于您命名发布配置文件的内容)。

  5. 只需在PublishProfile 中添加一个标签来设置EnvironmentName变量,剩下的工作appsettings.*.json文件命名约定完成。

    <PropertyGroup>
        <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>
    
    Run Code Online (Sandbox Code Playgroud)

参考:用于 ASP.NET Core 应用程序部署的 Visual Studio 发布配置文件 (.pubxml)

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

  • 我已经完成了此操作,虽然它在已发布的 web.config 文件中正确设置环境,但我仍在处理 appsettings.*.json 文件。我有 appsettings.Staging.json 但当我发布时,它仍保留为 appsettings.Staging.json 并且不会变成 appsettings.json 并且网站无法工作(不读取该文件) (3认同)

Dav*_*ine 16

您应该按照文档中提供的说明使用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>
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以设置其他环境变量.

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


Nag*_* Hs 7

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

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

    "ASPNETCORE_ENVIRONMENT": "Development"
}
Run Code Online (Sandbox Code Playgroud)

稍后修改您的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它就会始终包含在发布中,您可以根据托管网站的环境更改为所需的值。

此方法也可用于控制台应用程序,因为更改位于文件Program.cs 中


小智 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

  • 您能否详细说明`您可以仅设置此msbuild属性$(EnvironmentName)并发布`或提供参考? (6认同)

Zbi*_*dro 6

您可以直接将ASPNETCORE_ENVIRONMENTenv 添加到 web.config 文件中:

<configuration>
  <system.webServer>
    <aspNetCore processPath="dotnet" arguments=".\MyProject.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)