今年の終わりにリリース予定の .NET Core 2.2 ですが、ASP.NET Core と Entity Framework Core に関しては Preview 3 で機能が出そろった感があるので、簡単に確認をしておきました。
予定通り 2.2 は小規模なリリースとなるので、これ以上の追加は無いかと思います。
Entity Framework Core 2.2 はアップデートが少ないですが、3.0 に持ち越しになったものが多い感じです。
Preview 2 時点での情報は、少し前に .NET Conf 2018 Tokyo で話したスライドもあるので、一緒に紹介しておきます。ASP.NET Core 2.2 以外の情報も扱っています。
セッションではチャックさんと好き勝手打ち合わせ無しで色々話しましたが、レコーディングは無いみたいなので残念です。一部はオフレコじゃないと話せない感じでしたが、その場にいた人の特権ということで。
例によって Preview 3 に関して自分が気になった機能だけメモしておきます。
ルーティング / リンク生成
2.2 Preview 3 では地味にルーティング周りが強化されています。中でも分かりやすいのはルーティングパラメータのカスタマイズに使う IOutboundParameterTransformer
でしょう。
公式ブログでも slugify の実装が紹介されていますし、Scott Hanselman もブログに書いてます。
ドキュメントによると RouteTokenTransformerConvention
として登録すると、Core MVC の [controller]
や [action]
にも反映されるようなので、属性ベースの場合でも手間を減らせそうです。
他にもこれまでは UrlHelper
を使うぐらいしかなかった URL の生成ですが、新しく LinkGenerator
クラスが導入されてコントローラやビュー以外からも扱いやすくなりました。
ブログでは触れられていないですが、URL の生成時に小文字に変換する LowercaseUrls
オプションから、クエリパラメータを小文字に変換するかの LowercaseQueryStrings
オプションが別に用意されました。
services.AddRouting(options => { options.LowercaseUrls = true; options.LowercaseQueryStrings = true; });
これまではクエリパラメータも強制的に小文字に変換されていたはずですが、外部の認証系を使う時に小文字に変換されてはまった記憶があります。今後は上手く回避できそうな感じがあります。
基本的には小文字を使う方が良いと思っているので、オプションは有効にしておくと思います。とりあえずテストコードを書いて LinkGenerator
の動作を確認します。
public class DemoService { public DemoService(IHttpContextAccessor httpContextAccessor, LinkGenerator linkGenerator) { _httpContextAccessor = httpContextAccessor; _linkGenerator = linkGenerator; } private readonly IHttpContextAccessor _httpContextAccessor; private readonly LinkGenerator _linkGenerator; public void TestMethod() { var path = _linkGenerator.GetPathByAction(_httpContextAccessor.HttpContext, "Query", "Demo", new { Search = "buchizo" }); } }
ソースコードを確認したところ、特に HttpContext
を与える必要は無さそうですが、上のコードで試してしまったのでそのままにしておきます。
与えると PathBase / Scheme などを反映してくれますが、パスの場合は不要ですね。
実行してみるとちゃんとパスが生成されました。他にも Uri を作るメソッドなどもあるので、メールにリンクを記載したい場合とかに便利に使えるのではないかと思っています。
DbContext に対するヘルスチェック
Preview 2 の時点でヘルスチェック用のエンドポイントをいい感じに用意してくれる機能が追加されましたが、Preview 3 ではそこに DbContext をチェックに追加できるようになってます。
ブログのサンプルにあるように Tag を使って liveness と readiness でエンドポイントを分けると、Kubernetes に持って行った時に良い感じに扱えそうです。ちなみに DbContext を追加した際に行ってくれるチェックは接続ぐらいなので、多少カスタマイズの余地はありそうです。
パフォーマンス改善
Model Validation 周りで不要な場合はスキップするようにしたとかで、パフォーマンスが改善したとか。主に配列周りを使っている場合に差が出そうですが、あまり影響しなさそう。
それよりも HttpClient のパフォーマンス改善が非常に大きいですね。SocketsHttpHandler を使っている場合に、コネクションプールのロック周りを改善した結果、スループットが大きく向上しているようです。特に Linux での効果が大きいですね。
該当の PR を見たところ、コネクションが使えるかどうかのチェックをロック中に行うのではなく、ロックを解放した後に行うようにしたようです。
チェックに失敗した場合はもう一度ロックを取りに行きますが、ほとんどのケースでは 1 回のロックで済むので全体的にはパフォーマンスが改善という話みたいです。ここまでの差が出るのは面白いですね。
ANCM v2 の改善
Preview 2 の時点で In-Process でかなりパフォーマンスが改善された ANCM v2 ですが、Preview 3 では HttpContext.RequestAborted
を使ってクライアントの切断を検知できるようになったようです。Long-running な処理でこの CancellationToken を見ておくと良さそうな感じ。
HttpContext.RequestAborted Property (Microsoft.AspNetCore.Http) | Microsoft Docs
それ以外には Web.config に handlerSettings
が追加されて、ASP.NET Core のログをファイルに書き出せるようになったみたいですね。実際にはログをファイルに書き出すことはあまりしないと思いますけど、App Service で使う分には良いのではないかと。
Cosmos DB Provider
新しく Owned
属性を追加して、Cosmos DB でのネストした構造を扱えるようにしたみたいです。正直なところ Cosmos DB の SDK を直接使った方が分かりやすいと思います。
特にクエリ周りに言及していないところを見ると、普通に LINQ を書くと Cosmos DB の RU が爆発して即死とか普通にありそうです。
Query Tags
また非常に地味なんですが、クエリにタグというかコメント行を付けて実行する機能が追加されています。例えば以下のような LINQ を書いて実行します。
_context.Shops.TagWith("Test Query Tag").FirstOrDefault(x => x.Id == 2);
SQL Server Profiler で実行されたクエリを見てみると、先頭に TagWith
で指定した内容がコメントとして付いていることが確認できますね。
クエリにコメントとして追加されるので、Application Insights などの APM でも確認できるという点がメリットでしょう。TelemetryProcessor でパースしてカスタムプロパティとして送信することも出来そうです。
パッとは使いどころが浮かばないですが、IQueryable<T>
の拡張メソッドとして実装されているので、メソッドチェーン中に混ぜることが出来るので面白い使い方が出来るのかも知れません。*1
これらの機能が含まれる .NET Core 2.2 については Connect(); 2018 で更に情報が出てくると思います。
Microsoft Connect(); 2018 Conference | Microsoft Azure
Visual Studio 2019 についても話が出てくるかもしれないので楽しみです。Azure はブチザッキに任せた。