しばやん雑記

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

ASP.NET Core 1.0 のプロジェクト構造とエントリポイントの話

ASP.NET Core 1.0 でアプリケーションを書く前に、どのような構造になっているのか知っておいた方がいいと思ったので、さらっと調べました。RC 2 でいろいろ変わっているので調べなおしという感じです。

Visual Studio を使って最低限の ASP.NET Core MVC 1.0 のプロジェクトを作成すると、大体は以下のような構造になります。Controllers とか Views は MVC 固有の要素になります。

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

appsettings.json や glupfile.js は必須ではないですが、便利なので追加されています。

ちょっとごちゃごちゃしているので、本質を理解するために空のプロジェクトを作りました。ASP.NET Core 1.0 で本当に最低限必要なファイルは以下のようになります。

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

本当に必要なものは Program.cs と Startup.cs、そして project.json ぐらいです。大体はこれがあれば dotnet コマンドでパッケージを復元して、実行することが出来ます。

Startup には懐かしい OWIN 的なコードが書いてあります。

public void Configure(IApplicationBuilder app)
{
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

IApplicationBuilder には大きく分けて Use と Run の二つのメソッドがあって、Use はリクエストパイプラインにミドルウェアを追加し、Run はパイプラインの終端で処理を実行するという形です。

この基本となるプロジェクトに ASP.NET Core MVC で必要となるコントローラとビューを追加していくと考えれば、これまでとあまり変わらない形で開発が出来る気がします。

エントリポイント

Windows 上で使われる、一般的なエントリポイントの定義を確認しておきます。

これまでとは異なり、ASP.NET Core では Builder パターンが多く使われるようになりました。呼び出しの順番が重要になることが多いので注意したいです。

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

特に説明は要らない気がしますが、この定義の意味は以下のような感じです。

  1. アプリケーションサーバーとして Kestrel を使う
  2. ContentRoot はカレントディレクトリ
  3. ASP.NET Core Module を使って IIS 連携を行う
  4. Startup クラスでアプリケーション設定を行う

ContentRoot はアプリケーション本体のルートとなります。

それとは別にドキュメントルートに相当する WebRoot が存在しています。デフォルトでは wwwroot が使われますが、UseWebRoot メソッドで変更することも出来ます。

デフォルト設定を使っていますが、UseKestrel など一部のメソッドでは引数で設定を行えるようになっています。例えば Kestrel の場合は以下のような設定項目があります。

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

NoDelay は Negle アルゴリズムを無効にする設定でしょう。それ以外にもスレッド数やヘッダーとストリームのプール数など、パフォーマンスに関わる部分の設定が行えます。

IISIntegration に関しては、以前に HttpPlatformHandler から ASP.NET Core Module に切り替える理由を書いたので、そっちを参照してください。

IIS を使わない場合、特に Windows 以外で使う場合には、UseIISIntegration は不要です。

とりあえずエントリポイントの話はこれで終わりにします。次は Startup 周りを調べる予定です。