wiprog

C#, .NET, Scala ... について勉強したことのメモ

.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() 登場以前の時代のイディオムとして、空の配列が必要な場合に

(T[]) Enumerable.Empty<T>()

のように書く場合があります。 現在は 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 に対応していない等の場合は明示的に許可する必要があります。

KestrelServerOptionsAllowSynchronousIOtrue に設定することでこの問題を回避できます。