.NET Core 3.0 移行のハマりポイントまとめ
プロダクションで稼働している .NET Core 2.2 (ASP.NET Core 2.2) のシステムを .NET Core 3.0-preview8 に全移行したときのハマりポイントのまとめです。
公式の移行手順で説明が無いものを中心にのせています。
移行前のシステム
- ASP.NET Core 2.2 on EC2 (linux)
- .NET Core 2.2 on ECS
- ASP.NET Core 2.2 on on-premises (ubuntu 18.04)
Enumerable.Empty()
の実装変更
これまで、 Enumerable.Empty()
は Array.Empty()
と同じく空の配列を返していました。 そのため、 Array.Empty()
登場以前の時代のイディオムとして、空の配列が必要な場合に
のように書く場合があります。 現在は Array.Empty()
があるので必要ありませんが、今回のシステムでは一部このコードが残っていました。
.NET Core 3.0 では、内部実装が変更され、配列ではなく EmptyPartition<T>
を返すようになっているため、 T[]
にキャストできず実行時に例外が発生していました。
JSON シリアライザの変更
ASP.NET Core 3.0 ではデフォルトの JSON シリアライザが変更され、 Newtonsoft.Json への依存が削除されているので、互換性を保つためには Microsoft.AspNetCore.Mvc.NewtonsoftJson
パッケージへの参照を追加して、 startup で .AddNewtonsoftJson()
を呼ぶ必要があります。
Newtonsoft と ASP.NET Core 3.0 標準のシリアライザでは enum のデシリアライズの挙動に違いがありました。
同期 I/O のブロック
ASP.NET Core 3.0 では同期 I/O が禁止されました。 同期 I/O を使う処理があると、実行時に例外を吐くようになっています。 パフォーマンスの面から I/O は非同期にすべきですが、依存ライブラリが非同期 I/O に対応していない等の場合は明示的に許可する必要があります。
KestrelServerOptions
の AllowSynchronousIO
を true
に設定することでこの問題を回避できます。