しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core アプリケーションでも web.config をカスタマイズしたい

ASP.NET Core のプロジェクトを dotnet publish を使って発行すると自動的に web.config が作られるようになっています。基本的に IIS や App Service でホストする場合には必須です。

自動生成されるので IIS 周りのカスタマイズが難しそうに見えますが、比較的簡単かつ ASP.NET の時と同じような形でカスタマイズが出来るので、動作を確認しておきました。

普通に web.config を利用する

テンプレートから作成した ASP.NET Core のプロジェクトには web.config は存在しないですが、手動で作成するとそれをベースに必要な設定を追加してくれるので非常に便利に使えます。

適当に web.config を作成して、プロジェクトに追加しておきましょう。

f:id:shiba-yan:20190604002521p:plain

中身は何でも良いのですが、今回は以下のような内容で用意しました。注意点としては location タグで囲むのを忘れないようにするぐらいです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <security>
        <requestFiltering removeServerHeader="true" />
      </security>
    </system.webServer>
  </location>

</configuration>

この設定をベースにするので、XDT の設定は不要です。普通に web.config を書けば良いです。

そして dotnet publish を実行し、出力された web.config を確認すると以下のようになります。

f:id:shiba-yan:20190604014731p:plain

ASP.NET Core Module の設定以外に、ちゃんとプロジェクトに追加した web.config に追加した設定が含まれています。ほとんどのケースでは、このように web.config を用意するだけで良いと思います。

注意点としてはファイル名を web.config のように全て小文字にしなかった場合、ビルドが case-sensitive なファイルシステム上で行われると別のファイルとして扱われて詰みます。

実際に Web.config としたプロジェクトを Ubuntu 上で発行すると、別で存在してしまっています。

f:id:shiba-yan:20190604004944p:plain

.NET Core のアプリケーションは Linux でビルドしたものを Windows に持っていくことが可能なので、地味にはまってしまいそうなポイントでした。他にも特定の EnvironmentName 向けに用意した appsettings.json が case-sensitive を考慮していないと、実行時にはまるので気を付けましょう。

XDT を使って変換する

ベースとなる web.config を用意する以外にも、ビルド構成や特定の環境向けに XDT を使った変換が行えるようです。発行プロファイルも使えるみたいですが、ASP.NET Core だと利用頻度が非常に少なそうです。

ビルド構成も Release 以外を使う機会がほぼ無さそうなのと、web.config でデバッグ向けに変更したい項目が思いつかなかったので、基本は特定の環境向けになるかと思っています。

XDT 変換の順番が異なるだけで、それぞれ特定の命名規約に従った XDT を用意するだけです。今回は Staging 向けに用意したので、ファイル名を web.Staging.config にしました。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <location>
    <system.webServer>
      <aspNetCore startupRetryCount="5" requestTimeout="00:01:30" xdt:Transform="SetAttributes"></aspNetCore>
    </system.webServer>
  </location>

</configuration>

設定内容に特に意味はないですが、処理されるタイミングを確認する意味で選びました。

このファイルは変換時のみ必要なので、プロパティからビルドアクションを「なし」に変更しておきます。これで出力先に含まれなくなるので安心です。

f:id:shiba-yan:20190604013256p:plain

ASP.NET Core での EnvironmentName は、ほぼ ASPNETCORE_ENVIRONMENT を実行環境側に設定して実行時に切り替えてきたはずですが、dotnet publish のタイミングでも指定できたようです。

dotnet publish -c Release /p:EnvironmentName=Staging

csproj に書くことも出来るようですが、発行プロファイルを用意した時専用という感じです。

実行結果は以下の通りで、ちゃんと XDT を使った変換が行われていることが確認できます。ビルド時に EnvironmentName を指定すると web.config に含まれるので、実行環境側での設定が不要になるようです。

f:id:shiba-yan:20190604014742p:plain

環境変数は App Service だと Azure Portal から設定できますが、他の IIS でホストしている環境の場合は XDT を使って、CI の段階で入れておいた方が楽かもしれません。

ASP.NET Core アプリケーションを IIS でホストする機会が減ってきていると思いますが、App Service では重要となるので覚えておいて損はないでしょう。地味に IIS 側で処理されている部分はまだまだ多いです。