发布到IIS,设置环境variables
阅读这两个问题/答案,我能够在IIS 8.5服务器上运行Asp.net 5应用程序。
Asp.net vNext早期testing版发布到Windows Server中的IIS
如何configuration一个MVC6应用程序在IIS上工作?
问题是,即使在IIS上运行,Web应用程序仍然使用env.EnvironmentName
和值Development
。
另外,我想在同一台服务器上运行同一个Web(Staging,Production)的两个版本,所以我需要一个方法来为每个Web分别设置variables。
如何做到这一点?
这个答案最初是为ASP.NET Core RC1编写的。 在RC2中,ASP.NET Core从通用httpPlafrom处理程序移到了aspnetCore特定的一个。 请注意,第3步取决于您使用的是哪个版本的ASP.NET Core。
可以设置ASP.NET Core项目的环境variables,而不必为用户设置环境variables或不必创build多个命令项。
- 在IIS中转到您的应用程序并select
Configuration Editor
。 - select
Configuration Editor
- 在combobox中select
system.webServer/aspNetCore
(RC2和RTM)或system.webServer/httpPlatform
(RC1) - 在
From
combobox中selectApplicationhost.config ...
- 点击
enviromentVariables
元素并打开编辑窗口。 - 设置你的环境variables。
- closures窗口,然后单击应用。
- 完成
这样,您不必为您的池创build特殊用户,或者在project.json
创build额外的命令条目。 此外,为每个环境添加特殊命令会中断“构build一次,部署多次”,因为您必须为每个环境单独调用dnu publish
,而不是一次发布并部署多次产生的工件。
更新了RC2和RTM,感谢Mark G和Tredder。
编辑:从RC2和RTM版本开始,此build议已过时。 我发现在发行版中完成此操作的最佳方法是在IIS中为每个环境编辑以下web.config部分:
system.webServer/aspNetCore
:
编辑environmentVariable条目并添加一个环境variables设置:
ASPNETCORE_ENVIRONMENT
: < Your environment name >
作为drpdrp方法的替代方法,您可以执行以下操作:
- 在您的project.json中,添加将ASPNET_ENVvariables直接传递给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
我发现这种方法比创build额外的IIS用户更less干扰。
广泛的谷歌search后,我find了一个工作解决scheme,它由两个步骤组成。
第一步是将系统范围的环境variablesASPNET_ENV设置为生产并重新启动Windows Server 。 在此之后,所有的networking应用程序都获得值'生产'作为EnvironmentName。
第二步(启用登台Web的值“Staging”)更难以正确工作,但这里是:
- 创build新的Windows用户,例如服务器上的StagingPool 。
- 对于这个用户,用值'Staging'创build新的用户variablesASPNET_ENV(你可以通过以这个用户login或通过registrylogin)
- 在IISpipe理器中以pipe理员身份返回,find正在运行登台 Web的应用程序池,并在高级设置中将身份设置为用户登台池 。
- 还要将“ 加载用户configuration文件”设置为true ,以便加载环境variables。 < – 非常重要!
- 确保StagingPool具有对Web文件夹的访问权限并停止并启动应用程序池。
现在,登台Web应该将EnvironmentName设置为“Staging”。
更新:在Windows 7+中, 还有一个命令可以为CMD提示设置环境variables,也可以为指定的用户设置。 这输出帮助加样本:
>setx /?
更新了RTM和RC2
使用<aspNetCore>下的<environmentVariables>部分更新web.config
<configuration> <system.webServer> <aspNetCore .....> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /> </environmentVariables> </aspNetCore> </system.webServer> </configuration>
或者为了避免在覆盖web.config时丢失这个设置,对applicationHost.config进行类似的更改,指定@NickAb所build议的站点位置。
<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>
我有IIS Web服务器上托pipe的Web应用程序(PRODUCTION,STAGING,TEST)。 所以不可能依赖ASPNETCORE_ENVIRONMENT操作系统的环境variables,因为将其设置为一个特定的值(例如STAGING)会影响其他应用程序。
作为解决scheme,我在我的visualstudio解决scheme中定义了一个自定义文件(envsettings.json):
具有以下内容:
{ // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting. // - Production // - Staging // - Test // - Development "ASPNETCORE_ENVIRONMENT": "" }
然后,根据我的应用程序types(Production,Staging或Test),我设置了这个文件:假设我正在部署TEST应用程序,我将会:
"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(); } }
请记住在publishOptions(project.json)中包含envsettings.json:
"publishOptions": { "include": [ "wwwroot", "Views", "Areas/**/Views", "envsettings.json", "appsettings.json", "appsettings*.json", "web.config" ] },
这个解决scheme使我可以自由地将ASP.NET CORE应用程序托pipe在同一个IIS上,与环境variables值无关。
@tredder解决scheme与编辑applicationHost.config是一个工作,如果你有几个不同的应用程序位于IIS上的虚拟目录。
我的情况是:
- 我有同一个域下的API项目和APP项目放在不同的虚拟目录中
- 根网页XXX似乎不传播ASPNETCORE_ENVIRONMENTvariables的虚拟目录中的子项和…
- …我无法将虚拟目录中的variables设置为@NickAb描述(有错误请求不支持(保存configuration编辑器中的更改时)(从HRESULTexception:0x80070032 ):
-
进入applicationHost.config并手动创build像这样的节点:
<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做了这项工作。
要扩展@ tredder的答案,你可以使用appcmd
来改变环境variables
分期
%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
- visual studio 2015 update 2 RTM和RCdebugging上下文不可用
- System.Net.Http vs Microsoft.Net.Http
- 项目的默认XML名称空间必须是MSBuild XML名称空间
- 如何在Entity Framework Core中运行存储过程?
- 使用HttpClient PostAsJsonAsync在ASP.NET Core中发送HTTP POST消息
- 安装Dot Net Core 1.0.0 VS 2015工具预览版的问题2
- ASP.NET Core API只返回列表的第一个结果
- 迷失在版本和工具中:.NET核心,核心工具,dotnet核心CLI,
- Visual Studio 2017错误:无法启动程序,一个操作在当前状态是不合法的