プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2019/06/05

ASP.NET Core アプリケーションを IIS でホストする際にはまったこと

update2019/06/07 event_note2019/06/05 5:22

以前、ASP.NET Core アプリケーションを IIS でホストする場合について記事を書きましたが、環境やアプリケーションによってはいろいろはまることがあったので、メモしておきます。

ちなみに前回の記事は以下です。

以下、私が遭遇した事象についてです。

アプリケーションが起動しない

以下のような画面が表示され、アプリケーションが起動しませんでした。

An error occurred while starting the application.

まずはログを出力するように変更する

状況がわからないので、ログを出力するように設定を変更します。

Web.config を開き、stdoutLogEnabledtrue にします。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\MyApplication.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 77400ADB-8E48-46B3-AACD-4DF7C81A1A89-->

logs フォルダに stdout_xxx.log というファイルが作成されるようになります。

それでもログが出力されない

アプリケーションプールの実行ユーザーにファイル書き込みの権限がない場合は、上記の設定を行ってもログが出力されません。

以下のサイトを参考に設定を行いました。

手動だとアプリケーションが起動するが、IIS 経由だとアプリケーションが起動しない

exe をダブルクリックしたり、dotnet コマンドからアプリケーションを起動した場合は問題なく起動するのに、IIS 経由だとアプリケーションが起動しないことがありました。

環境変数の Path に設定されている場所を参照して dll を読み込んでいる処理があったのですが、ユーザー環境変数にのみ設定され、システム環境変数には設定されていないことが原因でした。

手動でアプリケーションを起動する場合は現在ログイン中のユーザーで実行されますが、IIS 経由の場合、アプリケーションプールの実行ユーザーになるためです。

この場合、システム環境変数に設定を行うことでアプリケーションが起動するようになりました。

外部からアクセスできない

以下が参考になるかもしれません。

アプリケーションを自動起動する

デフォルトだとサイトにアクセスするまでアプリケーションが起動しませんが、IIS 起動時にアプリケーションも起動するようにしたい場合があります。

これについては以下の記事が参考になりました。