web-dev-qa-db-ja.com

環境変数を設定してIISに公開する

これら2つの質問/回答を読んで、IIS 8.5サーバーでAsp.net 5アプリを実行できました。

Asp.net vNext初期ベータ版はWindowsサーバーのIISに公開

IISで動作するようにMVC6アプリを構成する方法

問題は、IISで実行する場合でも、Webアプリが値Developmentenv.EnvironmentNameを使用していることです。

また、同じWebの2つのバージョン(ステージング、プロダクション)を同じサーバーで実行したいので、各Webの変数を個別に設定する方法が必要です。

これを行う方法?

106
drpdrp

この回答は、元々ASP.NET Core RC1用に作成されました。 RC2では、ASP.NET Coreは汎用のhttpPlafromハンドラーからaspnetCore固有のハンドラーに移動しました。手順3は、使用しているASP.NET Coreのバージョンによって異なることに注意してください。

ユーザーの環境変数を設定したり、複数のコマンドエントリを作成したりすることなく、ASP.NET Coreプロジェクトの環境変数を設定できます。

  1. IISでアプリケーションに移動し、Configuration Editorを選択します。
  2. Configuration Editorを選択します
  3. Sectionコンボボックスでsystem.webServer/aspNetCore(RC2およびRTM)またはsystem.webServer/httpPlatform(RC1)を選択します
  4. FromコンボボックスでApplicationhost.config ...を選択します。
  5. enviromentVariables要素を右クリックして、'environmentVariables' elementを選択し、次にEdit Itemsを選択します。 enter image description here
  6. 環境変数を設定します。
  7. ウィンドウを閉じて「適用」をクリックします。
  8. 完了

この方法では、プールの特別なユーザーを作成したり、project.jsonに追加のコマンドエントリを作成する必要はありません。また、各環境に特別なコマンドを追加すると、一度発行して結果のアーティファクトを何度もデプロイする代わりに、環境ごとにdnu publishを個別に呼び出す必要があるため、「一度ビルドして何度もデプロイ」が壊れます。

Mark Gとtredderのおかげで、RC2とRTM用に更新されました。

243
NickAb

web.config<environmentVariables><aspNetCore>の下のセクションに更新します

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

または、web.configを上書きするときにこの設定が失われないように、@-NickAbが示唆するように、サイトの場所を指定するapplicationHost.configに同様の変更を加えます。

<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>
30
tredder

編集:RC2およびRTMリリース時点で、このアドバイスは古くなっています。リリースでこれを達成するために見つけた最良の方法は、IIS各環境:

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ユーザーを作成するよりも邪魔にならないことがわかりました。

21
Joshua Barron

徹底的なグーグル検索の後、2つのステップで構成される実用的なソリューションを見つけました。

最初の手順は、システム全体の環境変数ASPNET_ENVをProductionに設定し、Windows Serverを再起動することです。この後、すべてのWebアプリは、EnvironmentNameとして値「Production」を取得します。

2番目のステップ(ステージングWebの値 'Staging'を有効にする)は、正しく動作させるのがかなり困難でしたが、ここでは次のとおりです。

  1. たとえば、サーバー上にStagingPoolなどの新しいWindowsユーザーを作成します。
  2. このユーザーに対して、値 'Staging'で新しいユーザー変数ASPNETCORE_ENVIRONMENTを作成します(このユーザーとしてログインするか、regeditを使用して実行できます)
  3. IISマネージャーで管理者として戻り、ステージングWebが実行されているアプリケーションプールを見つけ、詳細設定でIDをユーザーに設定しますStagingPool
  4. また、Load User Profiletrueに設定すると、環境変数がロードされます。 <-非常に重要です!
  5. StagingPoolがWebフォルダへのアクセス権を持ち、アプリケーションプールを停止および開始することを確認します。

これで、ステージングWebのEnvironmentNameが「ステージング」に設定されます。

更新:Windows 7以降 コマンドがあります 指定したユーザーのCMDプロンプトから環境変数を設定できます。これは、ヘルプとサンプルを出力します。

>setx /?
16
drpdrp

Webアプリケーション(PRODUCTION、STAGING、TEST)をIIS Webサーバーでホストしています。そのため、特定の値(たとえば、STAGING)に設定すると他のアプリケーションに影響するため、ASPNETCORE_ENVIRONMENTオペレータのシステム環境変数に依存することはできませんでした。

回避策として、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();
        }
    }

EnvOptions.jsonをpublishOptions(project.json)に含めることを忘れないでください。

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

このソリューションにより、ASP.NET COREアプリケーションを環境変数の値に関係なく、同じIISで自由にホストできます。

14

@tredderの答えを拡張するには、appcmdを使用してenvironmentVariablesを変更できます

ステージング

%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

7
Christian

編集を伴う@tredderソリューションapplicationHost.configは、IISの仮想ディレクトリ内に複数の異なるアプリケーションがある場合に機能するソリューションです。

私の場合:

  • 私はAPI projectとAPP projectを同じドメインの下にあり、異なる仮想ディレクトリに配置しています
  • ルートページ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を再起動するとジョブが実行されました。

5
Bartosz Lenar

1か所で知る必要があるもの:

  • 環境変数で設定を上書きするには、ASPNETCORE_を接頭辞として付ける必要があります。
  • JSON構成で子ノードを一致させる場合は、:を区切り文字として使用します。プラットフォームが環境変数キーにコロンを許可しない場合は、代わりに__を使用します。
  • 設定をApplicationHost.configで終わるようにします。 IIS Configuration Editorを使用すると、入力がアプリケーションの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セーフでない文字は、左中括弧の%u007bのように、Unicodeとしてエスケープできます。

  • 現在の設定をリストするには(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のようなものを使用します。
5

上記のオプション以外にも、自動展開でうまく機能するか、構成の変更が少ないソリューションがいくつかあります。

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>

上記のコードは、デバッグ構成の場合、または構成が指定されていない場合、Developmentとして環境名を追加します。その他の構成の場合、生成されるweb.configファイルの環境名はProductionになります。詳細 ここ

2。発行プロファイルにEnvironmentNameプロパティを追加します。

公開プロファイルに<EnvironmentName>プロパティを追加することもできます。 Properties/PublishProfiles/{profilename.pubxml}にある公開プロファイルファイルを開きます。これにより、プロジェクトの公開時にweb.configで環境名が設定されます。詳細 こちら

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

3。 dotnet publishを使用したコマンドラインオプション

さらに、プロパティEnvironmentNameをコマンドラインオプションとしてdotnet publishコマンドに渡すことができます。次のコマンドは、web.configファイルにDevelopmentとして環境変数を含めます。

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

4
Abhinav Galodha

代わりに、目的の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>
3
Sheldon Nunes

他の回答と同様に、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
dasch88

xdt-transformations のためのgithubによく文書化されたツールがあります。また、コマンドに依存せず、dotnet publishとdotnet msbuildの両方が正常に機能します。

Web.debug.cofig、web.release.configなどの異なるweb.configファイルを作成する必要があります。それに基づいて、独自の環境変数を簡単に設定できます。

0
Anik Saha

Web.configの環境設定でIISを公開するためのリポジトリを作成しました。

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • セットアップ
    • .csprojファイルと.user.csprojファイルからプロジェクトファイルにセクションを取得します。
    • MyAspNetEnvironment.props、web.development.configおよびweb.production.configファイルを取得します。
  • 構成
    • 適切にuser.csprojのASPNETCORE_ENVIRONMENTプロパティの値を変更します。
0
subcoder

エラーに関する詳細を取得するには、対応するアプリケーションプールASPNETCORE_ENVIRONMENTsystem.applicationHost/applicationPools環境変数を追加する必要がありました。

注:私の場合、WebアプリケーションはASP.NET Core 2でホストされているIIS 10 Webアプリケーションでした。これは、Configuration EditorIIS Managerを介して実行できます(IIS Managerでこのエディターの場所を確認するには、 構成エディターでのコレクションの編集 を参照してください)。

0
Dmitry Pavlov