これら2つの質問/回答を読んで、IIS 8.5サーバーでAsp.net 5アプリを実行できました。
Asp.net vNext初期ベータ版はWindowsサーバーのIISに公開
問題は、IISで実行する場合でも、Webアプリが値Development
のenv.EnvironmentName
を使用していることです。
また、同じWebの2つのバージョン(ステージング、プロダクション)を同じサーバーで実行したいので、各Webの変数を個別に設定する方法が必要です。
これを行う方法?
この回答は、元々ASP.NET Core RC1用に作成されました。 RC2では、ASP.NET Coreは汎用のhttpPlafromハンドラーからaspnetCore固有のハンドラーに移動しました。手順3は、使用しているASP.NET Coreのバージョンによって異なることに注意してください。
ユーザーの環境変数を設定したり、複数のコマンドエントリを作成したりすることなく、ASP.NET Coreプロジェクトの環境変数を設定できます。
Configuration Editor
を選択します。Configuration Editor
を選択しますSection
コンボボックスでsystem.webServer/aspNetCore
(RC2およびRTM)またはsystem.webServer/httpPlatform
(RC1)を選択しますFrom
コンボボックスでApplicationhost.config ...
を選択します。enviromentVariables
要素を右クリックして、'environmentVariables' element
を選択し、次にEdit Items
を選択します。 この方法では、プールの特別なユーザーを作成したり、project.json
に追加のコマンドエントリを作成する必要はありません。また、各環境に特別なコマンドを追加すると、一度発行して結果のアーティファクトを何度もデプロイする代わりに、環境ごとにdnu publish
を個別に呼び出す必要があるため、「一度ビルドして何度もデプロイ」が壊れます。
Mark Gとtredderのおかげで、RC2とRTM用に更新されました。
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>
編集:RC2およびRTMリリース時点で、このアドバイスは古くなっています。リリースでこれを達成するために見つけた最良の方法は、IIS各環境:
system.webServer/aspNetCore
:
EnvironmentVariableエントリを編集し、環境変数設定を追加します。
ASPNETCORE_ENVIRONMENT
:< Your environment name >
Drpdrpのアプローチの代替として、次のことができます。
"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ユーザーを作成するよりも邪魔にならないことがわかりました。
徹底的なグーグル検索の後、2つのステップで構成される実用的なソリューションを見つけました。
最初の手順は、システム全体の環境変数ASPNET_ENVをProductionに設定し、Windows Serverを再起動することです。この後、すべてのWebアプリは、EnvironmentNameとして値「Production」を取得します。
2番目のステップ(ステージングWebの値 'Staging'を有効にする)は、正しく動作させるのがかなり困難でしたが、ここでは次のとおりです。
これで、ステージングWebのEnvironmentNameが「ステージング」に設定されます。
更新:Windows 7以降 コマンドがあります 指定したユーザーのCMDプロンプトから環境変数を設定できます。これは、ヘルプとサンプルを出力します。
>setx /?
Webアプリケーション(PRODUCTION、STAGING、TEST)をIIS Webサーバーでホストしています。そのため、特定の値(たとえば、STAGING)に設定すると他のアプリケーションに影響するため、ASPNETCORE_ENVIRONMENTオペレータのシステム環境変数に依存することはできませんでした。
回避策として、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": ""
}
次に、アプリケーションの種類(生産、ステージング、またはテスト)に基づいて、このファイルを適切に設定します。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で自由にホストできます。
@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
編集を伴う@tredderソリューションapplicationHost.configは、IISの仮想ディレクトリ内に複数の異なるアプリケーションがある場合に機能するソリューションです。
私の場合:
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を再起動するとジョブが実行されました。
1か所で知る必要があるもの:
ASPNETCORE_
を接頭辞として付ける必要があります。:
を区切り文字として使用します。プラットフォームが環境変数キーにコロンを許可しない場合は、代わりに__
を使用します。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としてエスケープできます。
%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
のようなものを使用します。上記のオプション以外にも、自動展開でうまく機能するか、構成の変更が少ないソリューションがいくつかあります。
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
代わりに、目的の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>
他の回答と同様に、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 }
xdt-transformations のためのgithubによく文書化されたツールがあります。また、コマンドに依存せず、dotnet publishとdotnet msbuildの両方が正常に機能します。
Web.debug.cofig、web.release.configなどの異なるweb.configファイルを作成する必要があります。それに基づいて、独自の環境変数を簡単に設定できます。
Web.configの環境設定でIISを公開するためのリポジトリを作成しました。
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
エラーに関する詳細を取得するには、対応するアプリケーションプールASPNETCORE_ENVIRONMENT
のsystem.applicationHost/applicationPools
環境変数を追加する必要がありました。
注:私の場合、WebアプリケーションはASP.NET Core 2
でホストされているIIS 10
Webアプリケーションでした。これは、Configuration Editor
のIIS Manager
を介して実行できます(IIS Manager
でこのエディターの場所を確認するには、 構成エディターでのコレクションの編集 を参照してください)。