drp*_*drp 119 iis asp.net-core-mvc visual-studio-2015 asp.net-core
阅读这两个问题/答案,我能够在IIS 8.5服务器上运行Asp.net 5应用程序.
Asp.net vNext早期测试版在Windows服务器上发布到IIS
问题是,即使在IIS上运行,Web应用程序仍然使用env.EnvironmentName值Development.
另外,我想在同一台服务器上运行同一个Web(Staging,Production)的两个版本,所以我需要一个方法来分别为每个Web设置变量.
这该怎么做?
Nic*_*kAb 252
这个答案最初是为ASP.NET Core RC1编写的.在RC2中,ASP.NET Core从通用的httpPlafrom处理程序转移到aspnetCore特定的处理程序.请注意,步骤3取决于您使用的ASP.NET Core版本.
结果可以设置ASP.NET核心项目的环境变量,而无需为用户设置环境变量或必须创建多个命令条目.
Configuration Editor.Configuration Editor system.webServer/aspNetCore(RC2和RTM)或system.webServer/httpPlatform(RC1)SectionApplicationhost.config ...在From组合框中.enviromentVariables元素并打开编辑窗口.这样您就不必为池创建特殊用户或创建额外的命令条目'environmentVariables' element.此外,为每个环境添加特殊命令会中断"构建一次,多次部署",因为您必须Edit Items为每个环境单独调用,而不是一次发布并多次部署生成的工件.
更新了RC2和RTM,感谢Mark G和Tredder.
Tre*_*els 30
使用<aspNetCore>下的<environmentVariables>部分更新web.config
<configuration>
<system.webServer>
<aspNetCore .....>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
或者为了避免在覆盖web.config时丢失此设置,请对applicationHost.config进行类似的更改,指定@NickAb建议的站点位置.
<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>
Run Code Online (Sandbox Code Playgroud)
Jos*_*ron 21
编辑:从RC2和RTM版本开始,此建议已过时.我发现在发布中完成此任务的最佳方法是在IIS中为每个环境编辑以下web.config部分:
system.webServer/aspNetCore:
编辑environmentVariable条目并添加环境变量设置:
ASPNETCORE_ENVIRONMENT : < Your environment name >
作为drpdrp方法的替代方法,您可以执行以下操作:
--iis-command
system.webServer/aspNetCore选项指定环境:ASPNETCORE_ENVIRONMENT
我发现这种方法比创建额外的IIS用户更少侵入.
drp*_*drp 16
经过广泛的谷歌搜索后,我找到了一个有效的解决方案,包括两个步骤.
第一步是将系统范围的环境变量ASPNET_ENV设置为Production并重新启动Windows Server.在此之后,所有Web应用程序都将值"Production"作为EnvironmentName.
第二步(为staging web启用值'Staging')更难以正常工作,但这里是:
现在,Staging Web应将EnvironmentName设置为"Staging".
更新:在Windows 7+中,有一个命令可以从CMD提示中为指定用户设置环境变量.这输出帮助加样品:
>setx /?
Run Code Online (Sandbox Code Playgroud)
Chr*_*nco 15
我在IIS Web服务器上托管了我的Web应用程序(PRODUCTION,STAGING,TEST).因此不可能依赖ASPNETCORE_ENVIRONMENT操作系统环境变量,因为将其设置为特定值(例如STAGING)会对其他应用程序产生影响.
作为解决方法,我在visualstudio解决方案中定义了一个自定义文件(envsettings.json):
以下内容:
{
// Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
// - Production
// - Staging
// - Test
// - Development
"ASPNETCORE_ENVIRONMENT": ""
}
Run Code Online (Sandbox Code Playgroud)
然后,根据我的应用程序类型(生产,登台或测试),我按照以下方式设置此文件:假设我正在部署TEST应用程序,我将:
"ASPNETCORE_ENVIRONMENT": "Test"
Run Code Online (Sandbox Code Playgroud)
之后,在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();
}
}
Run Code Online (Sandbox Code Playgroud)
请记住在publishOptions(project.json)中包含envsettings.json:
"publishOptions":
{
"include":
[
"wwwroot",
"Views",
"Areas/**/Views",
"envsettings.json",
"appsettings.json",
"appsettings*.json",
"web.config"
]
},
Run Code Online (Sandbox Code Playgroud)
这个解决方案让我可以自由地在同一个IIS上托管ASP.NET CORE应用程序,独立于环境变量值.
要扩展@tredder的答案,您可以使用更改环境变量 appcmd
分期
%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
与其他答案类似,我想确保我的 ASP.NET Core 2.1 环境设置跨部署持续存在,但也仅适用于特定站点。
根据 Microsoft 的文档,可以在 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,我仍然必须使用 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 }
Run Code Online (Sandbox Code Playgroud)
小智 7
您也可以使用以下方法将所需ASPNETCORE_ENVIRONMENT的参数作为参数传递给dotnet publish命令:
/p:EnvironmentName=Staging
Run Code Online (Sandbox Code Playgroud)
例如:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
Run Code Online (Sandbox Code Playgroud)
这将生成具有为项目指定的正确环境的web.config:
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Run Code Online (Sandbox Code Playgroud)
<EnvironmentName>到您的发布配置文件并完成它:<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
该信息被复制到web.config。(不要手动设置web.config,因为它会被覆盖。)
来源:https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/environments
您需要在一处知道的内容:
ASPNETCORE_。:用作分隔符。如果平台不允许在环境变量键中使用冒号,请__改用。ApplicationHost.config。使用IIS配置编辑器将使您的输入被写入应用程序的Web.config-并在下次部署中被覆盖!为了进行修改ApplicationHost.config,您需要使用appcmd.exe来确保您的修改是一致的。例:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site
不能安全使用URL的字符可以转义为Unicode,例如%u007b左大括号。
%systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site。除了上面提到的选项之外,还有其他两个解决方案可以很好地与自动部署一起使用,或者需要更少的配置更改。
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
如果在IIS上的虚拟目录中有多个不同的应用程序,则编辑applicationHost.config的 @tredder解决方案是有效的.
我的情况是:
进入applicationHost.config并手动创建如下节点:
<location path="XXX/app">
<system.webServer>
<aspNetCore>
<environmentVariables>
<clear />
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
<location path="XXX/api">
<system.webServer>
<aspNetCore>
<environmentVariables>
<clear />
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
并重新启动IIS完成了这项工作.
| 归档时间: |
|
| 查看次数: |
72310 次 |
| 最近记录: |