当我将asp.net核心Web应用程序发布到本地文件系统时,它始终采用production-config和ASPNETCORE_ENVIRONMENT变量,其值为=“ Production”。
我必须如何以及在何处设置ASPNETCORE_ENVIRONMENT变量的值,以便不仅可以将其用于调试,还可以将其用于发布?我已经尝试了以下选项,但没有成功:
- 在Windows设置中
- 在.pubxml文件中
- 在launchSettings.json中
- 在project.json中
当我将asp.net核心Web应用程序发布到本地文件系统时,它始终采用production-config和ASPNETCORE_ENVIRONMENT变量,其值为=“ Production”。
我必须如何以及在何处设置ASPNETCORE_ENVIRONMENT变量的值,以便不仅可以将其用于调试,还可以将其用于发布?我已经尝试了以下选项,但没有成功:
Answers:
除上述选项外,还有其他一些解决方案。
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
Debug配置或未指定配置添加环境名称。对于任何其他配置,环境名称将Production
在生成的web.config文件中。在这里更多细节
2.在发布配置文件中添加EnvironmentName属性。
我们也可以<EnvironmentName>
在发布配置文件中添加该属性。打开位于该位置的发布配置文件。Properties/PublishProfiles/{profilename.pubxml}
这将在发布项目时在web.config中设置环境名称。此处有更多详细信息
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
3.使用dotnet publish的命令行选项
另外,我们可以将该属性EnvironmentName
作为命令行选项传递给dotnet publish
命令。接下来的命令将包含Development
web.config文件中的环境变量。
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
正是我想要的。谢谢!
选项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>
您应该遵循的文档中提供的说明,使用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属性中指定的过程指定环境变量。本节中设置的环境变量优先于该过程的系统环境变量。
这是我们可以在运行时设置的方式:
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();
}
使用最新版本的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
you can just set this msbuild property $(EnvironmentName) and publish
或提供参考?
创建您的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>
参考:https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1
请参阅“设置环境”部分。
此变量可以保存在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中,因此也可以在控制台应用程序中使用此方法。
为了在每个站点上设置环境,我们在项目中使用的另一个选项是将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"
这样,我们可以拥有多个版本,所有版本都使用相同的工件,但是部署为不同的环境。
我知道这是一篇过时的文章,但由于没有人建议,我认为我会将简单的解决方案加入其中。
我使用当前目录确定当前环境,然后翻转连接字符串和环境变量。只要您对站点文件夹(如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();
}