阅读这两个问题/答案后,我能够在IIS 8.5服务器上运行Asp.net 5应用程序。
Asp.net vNext早期测试版发布到Windows服务器上的IIS
问题是,即使在IIS上运行,Web应用程序仍然使用值为“Development”的env.EnvironmentName
。
而且,我想在同一台服务器上运行相同Web的两个版本(暂存版和生产版),因此我需要一种方法来为每个Web单独设置变量。
如何做到这一点?
阅读这两个问题/答案后,我能够在IIS 8.5服务器上运行Asp.net 5应用程序。
Asp.net vNext早期测试版发布到Windows服务器上的IIS
问题是,即使在IIS上运行,Web应用程序仍然使用值为“Development”的env.EnvironmentName
。
而且,我想在同一台服务器上运行相同Web的两个版本(暂存版和生产版),因此我需要一种方法来为每个Web单独设置变量。
如何做到这一点?
这篇答案最初是为ASP.NET Core RC1编写的,而在RC2中,ASP.NET Core从通用http平台处理程序转移到了特定于AspNetCore的处理程序。请注意,步骤3取决于您使用的ASP.NET Core版本。
结果证明,可以在不设置用户环境变量或创建多个命令条目的情况下设置ASP.NET Core项目的环境变量。
这样,您就不必为池创建特殊用户或在project.json
中创建额外的命令条目了。此外,为每个环境添加特殊命令会破坏“一次构建,多次部署”,因为您将不得不单独调用dnu publish
以针对每个环境发布,而不是一次发布并多次部署生成的工件。
更新至RC2和RTM,感谢Mark G和tredder。
system.webServer/aspNetCore
。 - Mark G在<aspNetCore>下添加一个<environmentVariables>部分,更新包含web.config的配置文件。
<configuration>
<system.webServer>
<aspNetCore .....>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
<location path="staging.site.com">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
<location path="production.site.com">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
目标配置对象 '/system.webServer/aspNetCore/environmentVariables/environmentVariable' 未找到...
通常,要设置某些变量,我会编写类似以下的代码:
Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging
我错过了什么吗? - Christianappcmd
。 - ChristianSet-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
。 - Curtis Buys<EnvironmentName>
:<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
您可以通过以下方式,将所需的ASPNETCORE_ENVIRONMENT
作为参数传递给dotnet publish命令:
/p:EnvironmentName=Staging
例如:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
这将生成包含项目所需环境的正确配置信息的web.config文件:<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
编辑:自从RC2和RTM版本发布以来,此建议已过时。在版本发布中,我发现实现此目的的最佳方法是编辑每个环境中IIS的以下web.config部分:
system.webServer/aspNetCore
:
编辑environmentVariable条目并添加环境变量设置:
ASPNETCORE_ENVIRONMENT
:<您的环境名称>
作为drpdrp方法的替代方案,您可以执行以下操作:
在project.json中,添加传递ASPNET_ENV变量直接给Kestrel的命令:
"commands": {
"Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development",
"Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging",
"Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production"
}
发布时,请使用--iis-command
选项指定环境:
dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
我发现这种方法比创建额外的IIS用户更不会打扰。
我的Web应用(生产,暂存,测试)托管在IIS Web服务器上。因此,无法依赖于ASPNETCORE_ENVIRONMENT操作系统环境变量,因为将其设置为特定值(例如STAGING)会影响其他应用程序。
为了解决这个问题,我在Visual Studio解决方案中定义了一个自定义文件(envsettings.json):
文件内容如下:
{
// Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
// - Production
// - Staging
// - Test
// - Development
"ASPNETCORE_ENVIRONMENT": ""
}
然后,根据我的应用类型(生产、暂存或测试),我相应地设置这个文件:假设我正在部署测试应用程序,则会有:
"ASPNETCORE_ENVIRONMENT": "Test"
在Program.cs文件中,只需检索此值,然后设置webHostBuilder的环境即可。 public class Program
{
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 enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();
var webHostBuilder = new WebHostBuilder()
.UseKestrel()
.CaptureStartupErrors(true)
.UseSetting("detailedErrors", "true")
.UseContentRoot(currentDirectoryPath)
.UseIISIntegration()
.UseStartup<Startup>();
// If none is set it use Operative System hosting enviroment
if (!string.IsNullOrWhiteSpace(enviromentValue))
{
webHostBuilder.UseEnvironment(enviromentValue);
}
var host = webHostBuilder.Build();
host.Run();
}
}
请在发布选项(project.json)中包含envsettings.json:
"publishOptions":
{
"include":
[
"wwwroot",
"Views",
"Areas/**/Views",
"envsettings.json",
"appsettings.json",
"appsettings*.json",
"web.config"
]
},
此解决方案使我能够在同一IIS上托管ASP.NET CORE应用程序,而不受环境变量值的影响。除了上述选项之外,还有一些其他解决方案可与自动化部署很好地配合使用或需要更少的配置更改。
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>
以上代码将在Debug配置下或未指定任何配置时,在生成的web.config文件中添加环境名称为Development
。对于其他任何配置,生成的web.config文件中的环境名称都将为Production
。更多详情在这里
2. 在发布配置文件中添加EnvironmentName属性。我们也可以在发布配置文件中添加<EnvironmentName>
属性。打开位于Properties/PublishProfiles/{profilename.pubxml}
的发布配置文件。这将在项目发布时设置web.config中的环境名称。更多详情在这里。<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
3. 使用 dotnet publish 的命令行选项
此外,我们可以将属性EnvironmentName
作为命令行选项传递给dotnet publish
命令。以下命令将在web.config文件中包含环境变量Development
。
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
通过广泛使用谷歌搜索,我找到了一个可行的解决方案,它由两个步骤组成。
第一步是将系统范围内的环境变量ASPNET_ENV设置为Production并重新启动Windows Server。之后,所有Web应用程序的EnvironmentName都将获得值“Production”。
第二步(启用暂存Web的值“Staging”)要更难才能正确工作,但这里有:
现在,暂存Web应该将EnvironmentName设置为“Staging”。
更新:在Windows 7+中,有一个命令可以从CMD提示符为指定的用户设置环境变量。 这会输出帮助和示例:
>setx /?
和其他答案类似,我希望确保我的ASP.NET Core 2.1环境设置在部署后仍然存在,但也只适用于特定的网站。
根据微软的文档,在IIS 10中可以使用以下PowerShell命令在应用程序池上设置环境变量:
$appPoolName = "AppPool"
$envName = "Development"
cd "$env:SystemRoot\system32\inetsrv"
.\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='$appPoolName'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='$envName']" /commit:apphost
很不幸,我仍然不得不使用IIS 8.5,并认为自己没有机会。然而,仍然有可能运行简单的PowerShell脚本来为ASPNETCORE_ENVIRONMENT设置站点特定环境变量值:
Import-Module -Name WebAdministration
$siteName = "Site"
$envName = "Development"
Set-WebConfigurationProperty -PSPath IIS:\ -Location $siteName -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = $envName }
在@tredder的回答基础上,您可以使用appcmd
更改environmentVariables。
Staging
%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST
生产
%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST
Properties\launchSettings.json
来模拟另一个环境以进行调试。 - Oleg