如何设置 ASPNETCORE _ ENVIRONMENT 以考虑发布 ASP.NET 核心应用程序

当我将我的 ASP.NET Core web 应用程序发布到我的本地文件系统时,它总是带有 Production-config 和 ASPNETCORE _ ENVIRONMENT 变量,其值为 = “ Production”。

我必须如何以及在哪里设置 ASPNETCORE _ ENVIRONMENT 变量的值,以便它不仅被考虑用于调试,而且被考虑用于 也是为了出版?我已经尝试过以下方法,但没有成功:

  • 在视窗设定中
  • . pubxml文件中
  • 在文件 启动设置 json
  • 在文件 Project Json
242232 次浏览

选择一:

在 Windows 中设置 ASPNEtCORE _ ENVIRONMENT 环境变量:

  • 命令行 -setx ASPNETCORE_ENVIRONMENT "Development"

  • PowerShell-$Env:ASPNETCORE_ENVIRONMENT = "Development"

至于其他操作系统,请参阅 在 ASP.NET Core 中使用多个环境

选择2:

如果您想使用 web.config设置 ASPNETCORE _ ENVIRONMENT,那么像这样添加 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>

您应该遵循 文件所提供的指示,使用 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>

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

NET 核心模块允许您为 指定 processPath 属性中指定的进程 元素的一个或多个环境可变子元素中 AspNetCore 元素下的 Environment Variables 集合元素。 本节中设置的环境变量优先于系统 过程的环境变量。

在 VisualStudioIDE 中设置它的简单方法。

菜单 工程项目物业调试环境变量

Enter image description here

使用最新版本的 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

除了上面提到的选项,还有一些其他的解决方案。

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

此外,我们可以将属性 EnvironmentName作为命令行选项传递给 dotnet publish命令。下面的命令包含了 Web.config文件中的环境变量 Development

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

2. 修改项目文件(. 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>

上面的代码将为调试配置或未指定配置的情况下添加环境名称 Development。对于任何其他配置,生成的 Web.config文件中的环境名称都是 Production。更多细节是 给你

3. 在发布配置文件中添加 Environmental mentName 属性。

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

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

下面是我们在运行时设置它的方法:

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();
}

我发现通过直接在 Azure 平台上设置这个变量(如果你使用它的话) ,它对我很有用。

选择你的 web 应用程序→ 配置应用程序设置,然后添加变量及其值。然后按 保存键。

这个变量可以保存在 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"
}

稍后修改 程序文件,如下所示

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();
}
}

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

这个方法也可以在控制台应用中使用,因为修改在文件 程序中。

为了能够设置每个站点的环境,我们在项目中使用的另一个选项是向项目中添加一个包含以下内容的 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 应用程序部署”任务时工作得一样好) ,我们为 msloyment 设置了额外的参数:

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

通过这种方式,我们可以有多个版本,所有版本都使用相同的构件,但是作为不同的环境部署。

一个简单的解决办法

我使用工作目录来确定当前环境,然后翻转连接字符串和环境变量。只要你有一个网站文件夹的变数命名原则,比如 测试贝塔沙盒,这个工作就会很好。

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();
}
  1. 创建 应用程序设置 * . json文件(例如: Apptings. Development.json应用程序设置 Staging.jsonAppsets. Production.json)

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

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

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

  5. 只需在 PublishProfile中添加一个标记来设置 环境名称变量,其余的工作由 应用程序设置 * . json文件变数命名原则完成。

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

参考资料: Visual Studio 发布 ASP.NET Core 应用部署配置文件(. pubxml)

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

我不得不手动将这段代码添加到我的主方法中。这将基于 Azure 的应用程序设置环境

static async Task Main(string[] args)
{
...
//set the environment variable based on App Settings
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
builder.UseEnvironment(environment);

与其硬连接开发人员设置,不如将其添加到 .csproj:

<!-- Adds EnvironmentName variable during publish -->
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>


<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<EnvironmentName>Production</EnvironmentName>
</PropertyGroup>

如果你在 Windows、 Linux 或 Mac 上使用 骑士 IDE (来自 JetBrains) :

  • 点击 添加配置; Enter image description here
  • 在模式窗口中,单击位于左侧列中的 加上新的..。Modal window with no configuration
  • 选择 .NET 项目(模板将取决于您的项目类型)
  • 环境变数字段中,单击右侧的文档图标; Environment field in .NET Project modal window.
  • 在新窗口中,单击 +创建一个新的环境变量,输入键/值 ASPNEtCORE _ ENVIRONMENT/Development; Adding a new environment variable.
  • 单击窗口右下角的 好的
  • 单击窗口右下角的 申请

Rider 已经包含了项目的启动设置,并将其设置为项目调试和运行的默认设置。

Environment settings concluded and default

对于.NET 6,我发现这是最好的解决方案:

var webAppOptions = new WebApplicationOptions()
{
Args = args,


#if DEBUG
EnvironmentName = Environments.Development,
#else
EnvironmentName = Environments.Production,
#endif


};


var builder = WebApplication.CreateBuilder(webAppOptions);

我们还可以从配置文件中读取 EnvironmentName并在 WebApplicationOptions中设置它 然后打电话给 WebApplication.CreateBuilder

现在我们还可以在开发机器上测试生产环境。 我们只需要切换到 release建设,我们有生产环境。

不需要设置任何 ENVIRONMENT 变量。

这样做的好处还在于,我们不能意外地创建在 Development环境下运行的版本构建。

过去几天,我一直在寻找这个问题的答案,以了解如何通过部署到 Azure 应用服务的 Azure DevOps 发布管道来实现这一点。 以下是我如何做到这一点-希望这将有助于你。

在 Azure 应用程序服务部署任务 > 在应用程序和配置设置中设置此值:-ASPNETCORE _ ENVIRONMENT”

enter image description here

您可以直接将 ASPNETCORE_ENVIRONMENT env 添加到 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>

什么可能对一些人有帮助:

对于 NET6应用程序,当我在本地运行已发布的应用程序时,将 ASPNETCORE _ ENVIRONMENT 设置为 Development 似乎不起作用。

但是,当使用 IIS 复制到服务器时,它确实可以工作... ... 这可能是由于本地环境变量的原因。

但是,在服务器上,由于 ASPNETCORE _ ENVIRONMENT: Development 的原因,我的大胆文档被加载了。

我通过添加额外的 appsets.Staging.json 文件并使用以下命令发布来解决这个问题:

dotnet publish -c Release -r win-x64 --no-self-contained /p:EnvironmentName=Staging

最后,我确保特定于环境的变量不在通用 appsetings.json 中,而只在各自的 appsets.{ env } . json 文件中。

如前所述,将这些行添加到发布配置文件中:

<PropertyGroup>
<EnvironmentName>Production</EnvironmentName>
</PropertyGroup>

然后在. csproj 文件的条件部分使用这种语法,例如:

<Exec WorkingDirectory="$(SpaRoot)" Command="npm build --prod" Condition="'$(EnvironmentName)' == 'Production'>