0から始めるASP.NET Core その２

# 前回の続きですよ

前回は、dot net core 2.1 を利用し、ASP.NET Coreを空のプロジェクトを作り、Razor Pages 機能を使って単なる出力プログラムを作ってみました。そこで、日本語を出力させると、日本語がHTMLエンティティされるという問題が発生し、いろいろ調査。記事にしてみたところ、回答をいただいて解決！
新しい環境を始めると、いろんな課題が突き付けられて大変ですが、それも一つの楽しみなのかもしれません...（時間のある人ならば）

今回は、問題を調査している間に ASP.NET Core 1.x と ASP.NET Core 2.x の差によってどのようなコーティングをすればいいのか、何を意味しているのか、というのがわからない点もあったので、そのあたりの解析からしていこうと思います。

まだ、解決していない点や、解釈が間違ってるかもしれませんので、お手柔らかにお願いします。

# もくじ

* [0から始めるASP.NET Core その1:ASP.NET Core 2.1 のRazor Pages で始めるよ!](https://qiita.com/toryuneko/items/fa099d29005bacd78bbe)
* 0から始めるASP.NET Core その2:Main関数の中身

# ASP.NET Core 1.x と 2.x の差

情報を調べていると、Main関数は次の２つのパターンで紹介されていることが多い。

よくあるのはこっち。

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

    host.Run();
}
```

VS2017でCore 2.1環境で作るとこっち。

```c#
public static void Main(string[] args)
{
	CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
	WebHost.CreateDefaultBuilder(args)
		.UseStartup<Startup>();
```

どうやら、上はASP.NET Core 1.x の時で、下が 2.x の時の場合のようです。圧縮されまくって何が何やら訳が分からない状況ですが、下のCreateDefaultBuilderによって、

```C#
UseKestrel();
UseContentRoot();
UseIISIntegration();
```

この３つを書かなくても済むようになったようですね。
とはいえ、これらを変更したり拡張したりしたくなったらどうするのか？
というのを調べてみました。

## UseKestrel() メソッド

これは、Webサーバー（HTTP/HTTPS/WebSocket等）の役割を持つサーバーを作るためのメソッドですね。HTTPリクエストをネットワーク経由でブラウザー（等）から受け取り、HttpContextを生成する役割を持ってるようです。
2.1でも、メソッドは残っており（残っていないと、Webサーバーのオプション設定できないよ！）、次のようにしてオプションをするようです。

```C#
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            // 接続最大数は 100 件までですよ
            options.Limits.MaxConcurrentConnections = 100;
            // リクエスト数は100Mまでですよ
            options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
        })
        .Build();
```
のように、ラムダ式経由で拡張が可能です。
[Microsoft ASP.NET Core Document](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1)

# UseContentRoot() メソッド

ドキュメントで検索しても「Webホストが使用するコンテンツルートディレクトリ」としか書いておらず、コンテンツってなんやねん！という状況で、静的コンテンツの場所を示してるのか、アプリケーションの場所を示しているのかがちょっとわからなかったです。とりあえず、`Directory.GetCurrentDirectory()`メソッド経由で、以前はアプリケーションルートを拾っているようなので、アプリケーションの場所を示すためのメソッドなのかと推測中。
[Microsoft ASP.NET Core Document](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.hosting.hostingabstractionswebhostbuilderextensions.usecontentroot?view=aspnetcore-2.0#Microsoft_AspNetCore_Hosting_HostingAbstractionsWebHostBuilderExtensions_UseContentRoot_Microsoft_AspNetCore_Hosting_IWebHostBuilder_System_String_)

# UseIISIntegration() メソッド

IISといえば、Microsoftの一部OSバージョンを除いてNT系列で搭載されているWebサーバーのことなのですが、ドキュメントを見ても、いまいち意味を理解できず、IIS関係の機能か何かかなーと思っていたのです。ところが...
[Microsoft ASP.NET Core Document](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.hosting.webhostbuilderiisextensions.useiisintegration?view=aspnetcore-2.0#Microsoft_AspNetCore_Hosting_WebHostBuilderIISExtensions_UseIISIntegration_Microsoft_AspNetCore_Hosting_IWebHostBuilder_)

# UseHttpSys() メソッド

調べていると、`UseHttpSys()` メソッドというのが存在することを確認。このメソッドは、Windowsでのみ動作する「HTTP.sys」を利用しているサーバーです。Kestrelでは提供していない機能も提供しているようで、そこにWindows認証等もあり、こっちがIIS関係のものじゃないかと疑い。
はて、`UseIISIntegration()`メソッドとは何者でしょうか。

# 情報が多すぎるのと複雑すぎて大変

PHPやASP(VBScript)とは違って、フレームワーク系を利用すると事前準備が必要なコードが多く、その意味を調べるのが大変ですね。例えば、PHPでPOSTリクエストを取得するには `$_POST[...]` や　`filter_input(INPUT_POST, '...');` 等のように取得するだけですが、このようなフレームワークを通しての取得では、メソッドの引数に放り込まれたりするのですが、それのための作法を覚えたりするのが結構大変です。また、インターネット上の情報が、1.0や2.0を分けて書かれていないこともおく、どちらの記述方法なのかがわからないことも結構多く、またMicrosoftのドキュメントが使いし日本語情報が少なすぎて英語ができない猫は泣けます。

まだ、序盤で躓いてるので、GET,POSTのやりとりまでいけるのか、ちょっと不安です。