しばやん雑記

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

.NET Core 2.1 / ASP.NET Core 2.1 Preview 1 の気になった部分だけ試した

先月頭にロードマップが公開されていた .NET Core 2.1 ですが、もろもろ関連するもの全てが Preview 1 という形でリリースされました。

ASP.NET Core 2.1 も Preview 1 となりましたが、今回は SignalR が入ったりと更新が多いですね。

HttpClientFactory とか Span<T> などに関しては詳しい人が解説してくれそうなので、例によって自分が気になった部分だけをピックアップして試して見ました。

Brotli

リリースノートに書いてあった通り .NET Core 2.1 Preview 1 で Brotli のサポートが追加されていました。去年の段階では MyGet から CoreFX Lab 版をインストールすれば使える状態でしたが組み込まれました。

基本的に去年の段階から変わっていないようです。BrotliStream を使えばよい感じです。

使い道としてはやはり ASP.NET Core での圧縮だと思うので、実際に試しておきました。

大体は公式の紹介に合った通りで良いですが、2.1 Preview でデフォルト有効化された HTTPS の関係で、EnableForHttps の設定を追加する必要がありました。

services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
});

そもそも Brotli は HTTPS でしか使えなかったはずなので、ドキュメントコメントに書いてある内容をスルーしつつ有効化するしか選択肢がありません。*1

Chrome で表示してみると、ちゃんと Content-Encoding が br になっています。

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

Edge でも使えるので .NET Core 2.1 がリリースされたら有効にしてみたいです。

Cookie Policy

最近はブログなど開いた時にクッキーについての確認が良く出るなと思っていましたが、GDPR に関連する内容っぽいです。ASP.NET Core 2.1 ではこの辺りの実装に便利な機能が組み込まれました。

適当に ASP.NET Core アプリケーションを作って実行すれば、クッキーについての確認が表示されます。

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

承諾したかどうかは CookiePolicyMiddleware で処理されるので扱いは比較的楽です。

実際にクッキーが利用できるかどうかは Features から ITrackingConsentFeature を引っ張り出してくれば良いみたいです。テンプレートで生成されたコードを読めば大体理解できますね。

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

明示的に承諾していない場合には、アプリケーションがクッキーを書き出すようなコードになっていても、クライアントには出力されないので安心という実装でした。このアイディアは応用出来そうな気がします。

Generic HostBuilder

ASP.NET Core アプリケーションの場合は Program.cs で WebHost を使ってアプリケーションに必要な DI や設定などを行っていきますが、Web アプリケーション以外でも使える HostBuilder が追加されました。

調べた感じでは一瞬で終わるようなアプリケーション向けではなく、長時間動作するアプリケーション向けのようです。具体的には以下のようなコードを書いて使います。

class Program
{
    static async Task Main(string[] args)
    {
        var builder = new HostBuilder();

        builder.ConfigureServices(services=>
        {
            services.AddScoped<IHostedService, SampleService>();
        });

        await builder.RunConsoleAsync();
    }
}

public class SampleService : IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("Hello, world");

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

IHostedService を実装したクラスを HostBuilder がいい感じに実行してくれます。使い勝手としては ASP.NET Core にかなり近く、ちゃんと DI が使えるので HttpClientFactory などを使う場合にも楽そうです。

実行すると ASP.NET Core アプリケーション感があるメッセージが表示されます。

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

Ctrl+C / SIGTERM に反応するようになっているため、Docker でも Graceful Shutdown がちゃんと行えそうです。これはコンテナアプリケーション向けという感じもします。*2

ASP.NET Core Module

ダウンロードページには何故かリンクが載ってなかったのですが、GitHub にあるドキュメントからだと Server Hosting 向けのインストーラーがダウンロード出来るので、最新の ANCM をインストール出来ます。

IIS Express 向けにはインストールされないので Visual Studio からは簡単には使えないですが、IIS からは hostingModel を設定可能になっているので In-Process Hosting を試せます。

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

ANCM In-Process Hosting に関しては別で試してまとめようかと思っています。

*1:CRIME / BEAST があったからという理由でしょうけど

*2:ちなみに Windows Containers にも Graceful Shutdown はある