昨年Microsoftは、.NETフレームワークの最新バージョンである .NET 6をリリースした。このバージョンにはASP.NET Coreフレームワークに関わる新機能や改善が数多く含まれており、開発者の利用可能な機能の拡大と同時に、開発プロセスの簡略化を実現している。
ASP.NET Coreプロジェクトのテンプレートに、Angular 12、React 17、Bootstrap 5.1のサポートが新たに組み込まれた。.NET 6以降、.NETプロジェクトのすべてのテンプレートでは、"null-state analysis"機能がデフォルトで有効になっている。"null-state analysis"は、null参照を識別してSystem.NullReferenceExceptionを回避する上で有用な警告のセットである。
2021年初めにC#、Razor、スタイルシートファイルを対象としてリリースされたHot Reloadが、すべてのASP.NET Coreプロジェクトでサポートされるようになった。この機能を使えば、再コンパイルやデバッグセッションの再起動を必要とせずに、実行中のコードを変更することができる。Hot Reloadは、"dotnet watch
"コマンドを通じて、Visual StudioとVisual Studio Codeで使用可能である。
.NET WebAssemblyビルドツールは、Blazor WebAssembly用に特別に設計されたツールセットで、AOT(ahead-of-time)コンパイル、再リンク、ネイティブな依存関係などのサポートを追加する。Visual Studioインストーラ、またはShellウィンドウ内のdotnet workload install wasm-tools
を使うことでインストールが可能だ。
AOTコンパイルでは、アプリケーションコードをWebAssemblyにコンパイルすることにより、.NET IL(Intermediate Language)インタプリタを使用せずに、ブラウザが直接実行できるようになる。このプロセスは、アプリケーションのパフォーマンスを向上させる反面、アプリサイズという、より重要な犠牲を払うことにもなる。プロジェクトファイルに以下の行を追加すれば、AOT機能が有効になる。
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
Runtime Relinkingは、.NET WebAssemblyランタイムのdotnet.wasm
から使用されていないコードを取り除くことによってサイズを削減し、初回要求時のダウンロード速度を改善する。
Minimal APIは、最小限のクラスセットを操作する簡略的なASP.NET APIの作成を支援するもので、マイクロサービスアーキテクチャに有用な機能である。ルートがProgram.cs
クラス内に直接定義されるため、ルート毎に専用のコントローラを実装する必要がなくなり、コードサイズの削減が可能になる。ルートの定義方法の一例を以下に示す。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "This is a GET");
app.MapPost("/", () => "This is a POST");
app.MapPut("/", () => "This is a PUT");
app.MapDelete("/", () => "This is a DELETE");
app.Run();
残念ながらMinimal APIでは、フィルタなど、ASP.NET MVCコントローラの一部の機能がサポートされていない。
非同期ストリーミングがASP.NETコントローラのアクションと、JSONフォーマッタベースのデータ変換で利用できるようになった。IAsyncEnumerable
によってデータのバッファリングがなくなることで、メモリ資料量が大幅に削減される。このオプションをEntity Framework Coreで使用すれば、データベースから直接かつ非同期にデータを取得することが可能になる(遅延ローディングを無効にする必要がある)。IAsyncDisposable
がアップデートされて、コントローラ、Razor Pages、ビューコンポーネントのリソース処理がサポートされるようになった。非同期ストリームを操作するためには、DisposeAsync()
メソッドを使用してインターフェースを実装する必要がある。
ASP.NET Core 6にCSSアイソレーションのコンセプトが導入され、特定のページやビューを対象としたCSSスタイルの定義が可能になった。CSSファイルは、ページあるいはビューと同じ名前で、拡張子として.css
を使用しなければならない。例えば、Index.cshml
ページにのみ関連するスタイルは、Index.cshtml.css
というファイルに定義する必要がある。これらのファイルは、ビルドプロセス中に"{APP ASSEMBLY}.styles.css
"としてひとつの名前にバンドルされ、_Layout.cshml
ファイルから参照される。
CSSアイソレーションに似たもうひとつの機能は、JavaScriptモジュールに関連するものだ。"{PATH}/{PAGE, VIEW, OR COMPONENT}.{EXTENSION}
"(ページ、ビュー、コンポーネント)または"_content/{PACKAGE ID}/{PATH}/{PAGE, VIEW, OR COMPONENT}.{EXTENSION}
"(Razorクラスライブラリ)というパターンでアクセス可能なJavaScriptコードを、Index.cshml.js内に定義することが可能になった。
今回のASP.NET Coreリリースの強化点の多くは、Blazorに関連するものだ。Blazor Serverアプリでは、Razor PagesやMVCアプリをプリレンダリングして統合することが可能になった。また、JavaScriptやDynamicComponent
属性(型によるレンダリング指定)を使用すれば、Razorコンポーネントを、動的にレンダリングすることができる。さらに、HTMLの<head>
要素内のコンテンツを、HeadContent
コンポーネントを使って実行時に修正することも可能になった。以下の例のようにEditorRequired
属性を使うことで、同じコンポーネントが必須パラメータ(required parameter)を持てるようになった。
[Parameter]
[EditorRequired]
public string?FirstName { get; set; }
さらに、SupplyParameterFromQuery
属性を使って、クエリ文字列からのパラメータ<を指定することもできる。
[Parameter]
[SupplyParameterFromQuery(Name = "{QUERY PARAMETER NAME}")]
public string?{COMPONENT PARAMETER NAME} { get; set; }
今回の新リリースでは、ネットワーキングも大幅に強化されている。System.IO.Pipelines
とSslStream
の改善により、WebSocket接続のメモリサイズと接続毎のオーバーヘッドが(Microsoftによると)30パーセント削減された。
HTTP Loggingミドルウェアの導入により、リクエストとレスポンスの情報(ヘッダ、ボディ、共通プロパティなど)をロギングすることで、アプリケーション内の問題特定が容易になった。公開する情報をフィルタするために、さまざまなオプションが用意されている。W3Cloggerは、HTTP Loggingと同じ情報をログするもうひとつのミドルウェアだが、出力としてW3C標準形式を使用する。いずれのミドルウェアも、アプリケーションのパフォーマンスに影響を与えると同時に、機密性の高い情報が公開される可能性がある。
最後に、ASP.NET Core 6では、プレビュー機能としてHTTP/3がサポートされている。デフォルトでは有効になっていないため、Kestrel設定内で有効にする必要がある。最新のHTTPバージョンを使用するおもなメリットは、新たにトランスポート技術として使用されたQUICによって最初のリクエストに対するレスポンスが削減されることと、多重化をネイティブにサポートしていることだ。
ASP.NET Coreの現在のバージョンは6.0.1である。CVE-2021-43877(.NET 6アプリケーションがIIS内にホストされている時に特権昇格が可能になる脆弱性)などのセキュリティ修正や、アプリケーション起動コードの例外メッセージに関する改善も含まれている。ASP.NET MVCフレームワークに関しては、TagHelperMatchingConvention
属性に関する例外や、protobufおよびWeb APIテンプレート内の誤記が修正されている。
Microsoftによる公式資料には、ASP.NET Core 6の全機能が紹介されている。最新リリースバージョンはこちらからダウンロード可能だ。ASP.NET Coreの以前のバージョンを使用する既存アプリケーションは、こちらのステップに従ってアップグレードすることができる。