当我将我的asp.net核心Web应用程序发布到我的本地文件系统时,它总是需要生成配置和ASPNETCORE_ENVIRONMENT变量,其值为"生产"。
我如何以及在何处设置ASPNETCORE_ENVIRONMENT变量的值,以便不仅可以将其视为调试,还可以将视为发布?我已经尝试了以下选项但没有成功:
答案 0 :(得分:37)
<强>选项1:强>
在Windows中设置ASPNETCORE_ENVIRONMENT环境变量
命令行 - setx ASPNETCORE_ENVIRONMENT "Development"
PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"
对于其他操作系统,请参阅 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments
<强>选项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>
答案 1 :(得分:18)
答案 2 :(得分:15)
除上述选项外,还有其他一些解决方案。
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>
以上代码将为调试配置或未指定配置添加环境名称为Development
。对于任何其他配置,在生成的web.config文件中,环境名称将为Production
。更多详细信息here
2。在发布配置文件中添加EnvironmentName属性。
我们也可以在发布配置文件中添加<EnvironmentName>
属性。打开位于Properties/PublishProfiles/{profilename.pubxml}
的发布配置文件,这将在发布项目时在web.config中设置环境名称。更多详细信息here
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
3。使用dotnet发布的命令行选项
此外,我们可以将属性EnvironmentName
作为命令行选项传递给dotnet publish
命令。以下命令将在web.config文件中将环境变量包括为Development
。
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
答案 3 :(得分:12)
您应该使用<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>
跟踪instructions provided in the documentation。
{{1}}
请注意,您也可以设置其他环境变量。
ASP.NET核心模块允许您为其指定环境变量 processPath属性中指定的进程通过指定它们 在一个或多个环境中的可变子元素 aspNetCore元素下的environmentVariables集合元素。 本节中设置的环境变量优先于系统 该过程的环境变量。
答案 4 :(得分:5)
使用最新版本的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
答案 5 :(得分:2)
与其硬连线开发设置,不如将其添加到您的 #
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fc4ec043340, pid=1143, tid=0x00007fc4bcb85700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_102-b14) (build 1.8.0.102-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.102-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C 0x00007fc4ec043340
#
# Core dump written. Default location: /home/fportal/jaxx/leo/tomcat-7.0.42/bin/core or core.1143
#
# An error report file with more information is saved as:
# /home/fportal/jaxx/leo/tomcat-7.0.42/bin/hs_err_pid1143.log
Compiled method (c1) -1570440943 731555909 ! 1 java.text.SimpleDateFormat::subParse (1765 bytes)
中:
.csproj
答案 6 :(得分:1)
我不得不手动将这段代码添加到我的主要方法中。这将基于 Azure 的应用设置来构建环境
bcrypt(request()->password)
答案 7 :(得分:0)
通过在Azure platorm上直接设置此变量(如果使用它),我发现它对我有用。只需选择您的Web应用程序->配置->应用程序设置,然后添加变量及其值,然后按保存按钮即可。
答案 8 :(得分:0)
此变量可以保存在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
中,因此也可以在控制台应用中使用此方法答案 9 :(得分: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>
此文件的构建操作为 Content ,而复制操作为 Copy If Newer ,因此它将成为要部署的软件包的一部分。
然后,要部署程序包并设置环境,请在发行版中的“ WinRM-IIS Web App Deployment”任务下(它在使用“ IIS Web App deploy”任务时同样有效)下进行设置msdeploy的参数:
-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"
这样,我们可以拥有多个版本,全部使用相同的工件,但部署为不同的环境。
答案 10 :(得分: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();
}
答案 11 :(得分:0)
创建您的appsettings。*。json文件。 (例如:appsettings.Development.json,appsettings.Staging.json,appsettings.Production.json)
将变量添加到这些文件中。
像往常一样为每个环境创建一个单独的发布配置文件。
打开PublishProfiles / Development.pubxml(命名将基于您命名的Publish Profile)。
只需在 PublishProfile 中添加标签以设置 EnvironmentName 变量,其余的appsettings。*。json文件命名约定就可以完成。
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
请参阅“设置环境”部分。
答案 12 :(得分:0)
如果您在 Windows、Linux 或 Mac 上使用 RIDER IDE(来自 JetBrains):
答案 13 :(得分:-2)
这是我们在运行时设置的方式:
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();
}