ASP.NET Core 3.1以降では、Razor(つまりcshtml)のランタイムコンパイル機能が無効となっている。
これまではcshtmlをちょっと変えただけの場合、サイト全体を再発行せずとも該当のcshtmlだけを発行すれば動いたのだが、今はエラーになってしまう。
これは正直面倒だが、Startup.csでservices.AddRazorRuntimeCompilation() を呼び出すと有効化される、とのことだった。
services
.AddControllersWithViews()
.AddRazorRuntimeCompilation()
;
しかし、上記だけでは有効にならない。
というか、有効になっているようだが、実行時に「cshtmlで参照しているモデルクラスへの参照が見つからない」という趣旨のエラーが出ている模様。
cshtmlをroslynがリアルタイムコンパイルしようとして、依存DLLが見つからずに失敗する、という状況のようだ。
いろいろ調べてみたが、ASP.NET Coreのバージョンによっていろいろと違いがあるようで、何が有効で何が有効でないかよくわからない。
なので、最終的に動作した設定をここに書き留めておく。
行ったのは、.csproj または pubxml に以下の設定を加えることである。
TargetFrameworkはnet5.0となっている。
<PropertyGroup>
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
<EnableDefaultRazorGenerateItems>true</EnableDefaultRazorGenerateItems>
<EnableDefaultRazorComponentItems>true</EnableDefaultRazorComponentItems>
</PropertyGroup>
恐らく一部は古い設定で現在は無効となっている可能性がある。
よくわからない状態で放置するのは好きではないのだが、あまり時間をかけてもいられないので一旦これにて。
尚、Razorランタイムコンパイル機能が規定で無効化されたのは処理速度改善の一環のようなので、本番環境に適用する際にはメリット・デメリットを考えてよく検討されたい。
これは愚痴になるが、ASP.NET Core はただでさえASP.NET無印の頃の情報と混在してわけがわからないのに、ASP.NET Core自体も1.0/2.0/3.0/3.1/5.0/6.0の情報が混在してカオス化している。Microsoftも手を焼いているものと思われるが、ASP.NET Coreはとても使いやすくて便利なフレームワークと思うので、バージョン毎のドキュメントの分離をお願いしたい。やっと見つけた情報が、よく見たら古いバージョンだったり新しすぎるバージョンだったりした時の徒労感はもう味わいたくない。
追記 2023/3:この話をChatGPT-4に聞いてみた結果
Razorランタイムコンパイルを有効にするために、以下のpubxml設定を行ってください。
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
<CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
これらの設定を行うことで、Razorランタイムコンパイルが有効になります。ただし、ランタイムコンパイルを有効にすると、パフォーマンスに影響があることに注意してください。通常、開発環境でのみランタイムコンパイルを使用し、本番環境ではビューを事前にコンパイルすることが推奨されます。