发布到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多个命令项。

  1. 在IIS中转到您的应用程序并selectConfiguration Editor
  2. selectConfiguration Editor
  3. 在combobox中selectsystem.webServer/aspNetCore (RC2和RTM)或system.webServer/httpPlatform (RC1)
  4. Fromcombobox中selectApplicationhost.config ...
  5. 点击enviromentVariables元素并打开编辑窗口。
  6. 设置你的环境variables。
  7. closures窗口,然后单击应用。
  8. 完成

这样,您不必为您的池创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”)更难以正确工作,但这里是:

  1. 创build新的Windows用户,例如服务器上的StagingPool
  2. 对于这个用户,用值'Staging'创build新的用户variablesASPNET_ENV(你可以通过以这个用户login或通过registrylogin)
  3. 在IISpipe理器中以pipe理员身份返回,find正在运行登台 Web的应用程序池,并在高级设置中将身份设置为用户登台池
  4. 还要将“ 加载用户configuration文件”设置为true ,以便加载环境variables。 < – 非常重要!
  5. 确保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