vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

ASP.NET Coreのプロジェクトを発行(Publish)してみる

はじめに

これまで ASP.NET Core を実行するとき、Visual Studio や Rider 上で実行していました。

が、実際にはビルドしてアプリケーション単体で実行する必要があるため、これを試してみることにしました。

今回は組み込み Web サーバーである Kestrel だけを使う方法を試します。

Webサーバーについて

まず勘違いをしていたのですが、何となく ASP.NET Core で作った Web アプリケーションは、IIS などの Web サーバー上でないと動かないものだと思っていました。

実際のところは ASP.NET Core > Kestrel という構成で元々動作するものの、 Kestrel では機能が不足しているために ASP.NET Core > Kestrel > IIS などの Web サーバー(リバースプロキシ)という構成をとるものが多い、ということのようです。

組み込みの Web サーバーを使うのは SpringBoot でも同じですね。

バースプロキシを使う必要性については、下記が分かりやすいと感じました。

docs.microsoft.com

なお Kestrel を使う他にも方法があるようですが、ここでは Kestrel を使用することとします。

IIS と組み合わせる方法については次回以降トライする予定です。

話は戻って、この辺りの区別がついていなかったために後述のプロファイル作成などで結構迷ってしまうことになりました。

プロジェクトを発行する

では張り切ってプロジェクトを発行してみましょう。

Visual Studio の場合、 ビルド > WebApplication1 (プロジェクト名)の発行 から行うことができます。

プロファイルの作成

初めに発行のためのプロファイルを作成します。

f:id:mslGt:20180821214623j:plain

(最初はこの画面じゃなかった気がするのですが) この画面が表示されたら、 新しいプロファイル > フォルダー > 発行 で、 ASP.NET Core > Kestrel の構成で動作させるためのプロファイルが作成できます。

元の画面に戻ったら、 発行 ボタンを押せば(デフォルトでは bin\Release\netcoreapp2.0\publish に)実行のためのファイルが出力されます。

これに成功すれば、あとはターミナルなどで bin\Release\netcoreapp2.0\publish に移動し、下記のコマンドで実行すれば OK です。

dotnet WebApplication1.dll

外部アクセスを許可する

これまですっかり忘れていたのですが、デフォルトの状態だと実行中の ASP.NET Core のサイトに、同一ネットワークに接続している他の端末からアクセスすることはできません。

理由は二つあります。

  1. http://localhost:5XXX」のような URL ではアクセスできても、「http://IPアドレス:5XXX」ではアクセスできない
  2. Sinatra などと同様、デフォルトでは外部からのアクセスを制限している

これを何とかしてみます。

1.URL を変更する

Kestrel 単体で動かす場合

IIS Express などを使わず Kestrel 単体で動かす場合、プロジェクトフォルダ > Properties にある launchSettings.json を変更すれば OK です。

launchSettings.json

{
  ~省略~
  "profiles": {
    ~省略~
    },
    "WebApplication1": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://変更したいIPアドレス:ポート番号/"
    }
  }
}

IIS Express を使う場合

IIS Express を使う場合も launchSettings.json を変更するのですが、それだけではエラーになってしまいました。

launchSettings.json

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://変更したいIPアドレス:ポート番号/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    ~省略~
  }
}

ググってみると、 IIS Express 側の設定も変更する必要があり、 applicationhost.config を変更すればできる、とのこと。

ということで、ドキュメントフォルダ > IISExpress > config 以下にある applicationhost.config を変更したのですが、特に何も変わらないorz

さらにググってみると、どうやら別のところの applicationhost.config を見ているらしいと。

結局 ASP.NET Core ver.2.0 では プロジェクトフォルダ > .vs > config に置かれていました。

applicationhost.config

< site name="WebApplication1" id="2">
        < application path="/" applicationPool="WebApplication2 AppPool">
          < virtualDirectory path="/" physicalPath="プロジェクトフォルダまでのパス\WebApplication1\WebApplication1" />
        < /application>
        < bindings>
                    < binding protocol="http" bindingInformation="*:5XXX:変更したいIPアドレス" />
                    < binding protocol="http" bindingInformation="*:5XXX:localhost" />
        < /bindings>
      < /site>
  • 5XXX はポート番号です。念のため。

そしてやっぱりエラー

ええ、これでいけるぜやったぜ!と思いながら実行しました。

やっぱりエラーになるとorz

どうやら IIS Express で localhost 以外のアドレスを指定したい場合、Visual Studio を管理者として実行する必要があるようです。

とりあえずこれで localhost 以外のアドレスを扱えるようになりました。

あとは ACL(Access Control List) やファイヤーウォールの設定を行うことで外部からもアクセス可能になります。

IIS Express のWebサイトに他のホストからアクセスできるようにする - ASP.NETアプリケーションのデバッグ時に他のホストからのアクセスをする

2.外部からのアクセスを許可する

外部からのアクセスを許可するには、 Program.cs で、 Listen する URL を指定する必要がある、ということです。

Program.cs

using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication1 {
    public class Program {
        public static void Main(string[] args) {
            BuildWebHost(args).Run();
        }
        public static IWebHost BuildWebHost(string[] args) =>
            new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup()
                // すべてのアドレスを許可.
                .UseUrls("http://0.0.0.0:0")
                .Build();
    }
}

これで OK 。。。のはずだったのですが。

UseUrls が効かない

UseUrls を使っている・使っていないにかかわらず外部からアクセスできてしまいましたorz

ただ、例えば http://0.0.0.0:0http://1.2.3.4:5 のように変更するとエラーになったため、デフォルトでは制限なし、明示的に指定した場合のみ制限がかかる、ということかもしれません。

Empty でプロジェクトを作成したときに使用されている、 WebHost.CreateDefaultBuilder を見ても UseUrls は使用されていないようでした。

というわけで、結果としては 1.URL を変更する だけを設定すれば OK のようです。

なお今回は UseUrls を使う場合もハードコーディングしていましたが、JSON を使って環境によって切り替え、といったこともできるようです。

長くなってきたので今回は特にこれ以上触れません。

おわりに

localhost の代わりに IP アドレスを使うとかすぐできるでしょ。と高を括っていた割に時間がかかってしまいました(;゚Д゚)

次回は IIS を使ったリバースプロキシに挑戦してみる予定です。

多分。

※2018.08.24 追記

今回出力したファイルを使って、下記の方法で登録したら問題なく実行できました。

qiita.com

ということでやっぱり次回は Model についてかなぁ。

参照

IIS Express

IIS