首页 文章

发布到IIS,设置环境变量

提问于
浏览
101

阅读这两个问题/答案,我能够在IIS 8.5服务器上运行Asp.net 5应用程序 .

Asp.net vNext early beta publish to IIS in windows server

How to configure an MVC6 app to work on IIS?

问题是,即使在IIS上运行,Web应用程序仍然使用 env.EnvironmentName ,其值为 Development .

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

这该怎么做?

13 回答

  • 2

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

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

    • 转到IIS中的应用程序并选择 Configuration Editor .

    • 选择 Configuration Editor

    • Section 组合框中选择 system.webServer/aspNetCore (RC2和RTM)或 system.webServer/httpPlatform (RC1)

    • From 组合框中选择 Applicationhost.config ... .

    • 单击 enviromentVariables 元素并打开编辑窗口 .

    • 设置环境变量 .

    • 关闭窗口,然后单击“应用” .

    • 完成

    这样您就不必为池创建特殊用户或在 project.json 中创建额外的命令条目 . 此外,为每个环境添加特殊命令会中断"build once, deploy many times",因为您必须为每个环境单独调用 dnu publish ,而不是发布一次并多次部署生成的工件 .

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

  • 5

    <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建议的站点位置 .

    <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>
    
  • 0

    Edit: as of RC2 and RTM releases, this advice is out of date. The best way I have found to accomplish this in release is to edit the following web.config sections in IIS for each environment:

    system.webServer/aspNetCore

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

    ASPNETCORE_ENVIRONMENT< Your environment name >


    作为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用户更少侵入 .

  • 0

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

    第一步是将系统范围的环境变量ASPNET_ENV设置为Production和 Restart the Windows Server . 在此之后,所有Web应用程序都将获得值'Production'作为EnvironmentName .

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

    • 在服务器上创建新的Windows用户,例如 StagingPool .

    • 对于此用户,使用值'Staging'创建新的用户变量ASPNETCORE_ENVIRONMENT(您可以通过以此用户或regedit身份登录来执行此操作)

    • 在IIS管理器中以管理员身份返回,找到运行Staging Web的应用程序池,并在“高级设置”中将Identity设置为user StagingPool .

    • 同时将 Load User Profile 设置为 true ,以便加载环境变量 . < - 非常重要!

    • 确保 StagingPool 具有对Web文件夹和“停止并启动应用程序池”的访问权限 .

    现在,Staging Web应将EnvironmentName设置为“Staging” .

    更新:在Windows 7 there is a command中,也可以为CMD提示为指定用户设置环境变量 . 这输出帮助加样品:

    >setx /?
    
  • 21

    我在IIS Web服务器上托管了我的Web应用程序(PRODUCTION,STAGING,TEST) . 因此不可能依赖ASPNETCORE_ENVIRONMENT操作系统环境变量,因为将其设置为特定值(例如STAGING)会对其他应用程序产生影响 .

    作为解决方法,我在visualstudio解决方案中定义了一个自定义文件(envsettings.json):

    enter image description here

    以下内容:

    {
      // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
      // - Production
      // - Staging
      // - Test
      // - Development
      "ASPNETCORE_ENVIRONMENT": ""
    }
    

    然后,根据我的应用程序类型( 生产环境 ,登台或测试),我按照以下方式设置此文件:假设我正在部署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"
        ]
      },
    

    这个解决方案让我可以自由地在同一个IIS上托管ASP.NET CORE应用程序,独立于环境变量值 .

  • 221

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

  • 28

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

    我的情况是:

    • 我有 API 项目和 APP 项目,在同一个域下,放在不同的虚拟目录中

    • 根页面 XXX 似乎没有将ASPNETCORE_ENVIRONMENT变量传播到虚拟目录中的子节点...

    • ...我无法将虚拟目录中的变量设置为@NickAb描述(在配置编辑器中保存更改时出现错误 The request is not supported. (Exception from 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完成了这项工作 .

  • 14

    你需要在一个地方知道什么:

    • 对于要覆盖任何配置设置的环境变量,它们必须以 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 的内容 .

  • 4

    您也可以使用以下命令将所需的 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>
    
  • 16

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

    遗憾的是,我仍然不得不使用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 }
    
  • 3

    要获得有关错误的详细信息,我必须 add ASPNETCORE_ENVIRONMENT environment variable for the corresponding Application Pool system.applicationHost/applicationPools .

    注意:我的案例中的Web应用程序是在 IIS 10 上托管的 ASP.NET Core 2 Web应用程序 . 它可以通过 IIS Manager 中的 Configuration Editor 来完成(参见Editing Collections with Configuration Editor以找出在 IIS Manager 中找到该编辑器的位置) .

  • 0

    我已经创建了一个存储库,用于在Web.config中使用环境配置发布IIS .

    https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

    • 设置

    • 将.csproj和.user.csproj文件中的部分放入项目文件中 .

    • 获取MyAspNetEnvironment.props,web.development.config和web.production.config文件 .

    • 配置

    • 相关地更改user.csproj中ASPNETCORE_ENVIRONMENT属性的值 .

  • 7

    除了上面提到的选项之外,还有一些其他解决方案适用于自动部署或需要更少的配置更改 .

    1. Modifying the project file (.CsProj) file

    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>
    

    上面的代码会为调试配置添加环境名称 Development ,或者如果没有指定配置 . 对于任何其他配置,生成的web.config文件中的环境名称将为 Production . 更多细节here

    2. Adding the EnvironmentName Property in the publish profiles.

    我们也可以在发布配置文件中添加 <EnvironmentName> 属性 . 打开发布配置文件,该文件位于 Properties/PublishProfiles/{profilename.pubxml} . 这将在项目发布时在web.config中设置环境名称 . 更多详情here

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>
    

    3. Command line options using dotnet publish

    另外,我们可以通过该 properties EnvironmentName 作为 dotnet publish 命令的命令行选项 . 以下命令将在web.config文件中包含环境变量 Development .

    dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development

相关问题