发布到IIS,设置环境变量

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

如何配置MVC6应用程序在IIS上工作?

问题是,即使在IIS上运行,Web应用程序仍然使用env.EnvironmentNameDevelopment.

另外,我想在同一台服务器上运行同一个Web(Staging,Production)的两个版本,所以我需要一个方法来分别为每个Web设置变量.

这该怎么做?

Nic*_*kAb 252

这个答案最初是为ASP.NET Core RC1编写的.在RC2中,ASP.NET Core从通用的httpPlafrom处理程序转移到aspnetCore特定的处理程序.请注意,步骤3取决于您使用的ASP.NET Core版本.

结果可以设置ASP.NET核心项目的环境变量,而无需为用户设置环境变量或必须创建多个命令条目.

  1. 转到IIS中的应用程序并选择Configuration Editor.
  2. 选择 Configuration Editor
  3. 在组合框中选择system.webServer/aspNetCore(RC2和RTM)或system.webServer/httpPlatform(RC1)Section
  4. 选择Applicationhost.config ...From组合框中.
  5. 单击enviromentVariables元素并打开编辑窗口.
  6. 设置环境变量.
  7. 关闭窗口,然后单击"应用".
  8. 完成

这样您就不必为池创建特殊用户或创建额外的命令条目'environmentVariables' element.此外,为每个环境添加特殊命令会中断"构建一次,多次部署",因为您必须Edit Items为每个环境单独调用,而不是一次发布并多次部署生成的工件.

更新了RC2和RTM,感谢Mark G和Tredder.

  • 适用于Asp.Net Core 2.0 (14认同)
  • 对于第3步,我使用`system.webServer/aspNetCore`代替. (12认同)
  • @ brad-gardner如果对Applicationhost.config而不是web.config进行了更改,则更改将在部署之间保留. (11认同)
  • 在下次部署时,通过配置编辑器添加的设置是否会被清除? (7认同)
  • @the-red-pea 请注意,在您链接的说明中,web.config 已更改,而不是 applicationhost.config。对特定 IIS 服务器上的 web.config 的任何更改都将在下次部署时丢失。对 applicationhost.config 的更改在部署之间保留在特定 IIS 服务器上。 (3认同)
  • 有人真正使用这种方法进行生产吗?每次部署时它都会被吹走!您是否正在创建 web.config 文件并使用转换或其他东西?这个答案一点都不好:-( (2认同)

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)

  • 这与您的web.config是项目的一部分并在VCS中进行版本控制的方式有所不同。如果您有多个环境,例如prod,staging,dev,那么您将需要某种方式来转换每个环境的web.config。在IIS中更改ApplicationHost.config仅影响此IIS。这样,您就可以在VCS中拥有单个web.config,而IIS特有的环境变量将覆盖web.config变量。可以使用PowerShell http://www.iis.net/learn/manage/powershell/powershell-snap-in-changing-simple-settings-in-configuration-sections以编程方式编辑ApplicationHost.config (2认同)

Jos*_*ron 21

编辑:从RC2和RTM版本开始,此建议已过时.我发现在发布中完成此任务的最佳方法是在IIS中为每个环境编辑以下web.config部分:

system.webServer/aspNetCore:

编辑environmentVariable条目并添加环境变量设置:

ASPNETCORE_ENVIRONMENT : < Your environment name >


作为drpdrp方法的替代方法,您可以执行以下操作:

  • 在project.json中,添加将ASPNET_ENV变量直接传递给Kestrel的命令:

--iis-command

  • 发布时,使用该system.webServer/aspNetCore选项指定环境:

ASPNETCORE_ENVIRONMENT

我发现这种方法比创建额外的IIS用户更少侵入.

  • 如果您通过visual studio的msdeploy发布.然后,您可以将<IISCommand> Staging </ IISCommand>放入.pubxml文件中,即使您无法在发布UI中指定它,也将使用指定的IIS命令进行部署. (11认同)

drp*_*drp 16

经过广泛的谷歌搜索后,我找到了一个有效的解决方案,包括两个步骤.

第一步是将系统范​​围的环境变量ASPNET_ENV设置为Production并重新启动Windows Server.在此之后,所有Web应用程序都将值"Production"作为EnvironmentName.

第二步(为staging web启用值'Staging')更难以正常工作,但这里是:

  1. 创建新的Windows用户,例如服务器上的StagingPool.
  2. 对于此用户,创建值为"Staging"的新用户变量ASPNETCORE_ENVIRONMENT(您可以通过以此用户身份登录或通过regedit登录)
  3. 在IIS管理器中以管理员身份返回,找到运行Staging Web的应用程序池,并在"高级设置"中将Identity设置为用户StagingPool.
  4. 还将Load User Profile设置为true,以便加载环境变量.< - 非常重要!
  5. 确保StagingPool具有对Web文件夹和"停止并启动应用程序池"的访问权限.

现在,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应用程序,独立于环境变量值.

  • 当您必须创建另一层配置来管理框架的配置时,开箱即用的体验真是太棒了 (6认同)
  • “因此不可能依赖 ASPNETCORE_ENVIRONMENT 操作员的系统环境变量”的断言可能不正确。每个应用程序都有自己的池,因此没有什么可以阻止您为每个应用程序设置环境。 (2认同)

Chr*_*ian 7

要扩展@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


das*_*h88 7

与其他答案类似,我想确保我的 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)


Mar*_*ese 7

只需添加<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


rea*_*idt 6

您需要在一处知道的内容:

  • 要使环境变量覆盖任何配置设置,必须在它们前面加上ASPNETCORE_
  • 如果要匹配JSON配置中的子节点,请:用作分隔符。如果平台不允许在环境变量键中使用冒号,请__改用。
  • 您希望您的设置以结尾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左大括号。

  • 列出当前设置(与Web.config中的值结合使用): %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


Abh*_*dha 6

除了上面提到的选项之外,还有其他两个解决方案可以很好地与自动部署一起使用,或者需要更少的配置更改。

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


Bar*_*nar 5

如果在IIS上的虚拟目录中有多个不同的应用程序,则编辑applicationHost.config的 @tredder解决方案是有效的.

我的情况是:

  • 我确实有API项目和APP项目,在同一个域下,放在不同的虚拟目录中
  • 根页XXX似乎没有将ASPNETCORE_ENVIRONMENT变量传播到虚拟目录中的子节点,并且......
  • ...我无法将虚拟目录中的变量设置为@NickAb描述(得到错误请求不受支持.(在HRESULT异常:0x80070032)在配置编辑器中保存更改时):
  • 进入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完成了这项工作.