BlazorServerとRazorPages
RazorPageのViewファイルの拡張子が.cshtmlで、Blazorのページコンポーネントの拡張子が.razorてのに混乱しませんか?私は混乱します;でもって、RazorPageなプロジェクトと、BlazorServerなプロジェクトは異なるフレームワークのプロジェクトだと思い込んでしまいませんか?私はそう思い込んでしまっていました。だって、.razorをPagesフォルダに格納するのですから。ならば、このPagesはBlazorのPages格納庫だと思ってしまいます。しかし、BlazorServerプロジェクトのPagesフォルダをよく見ると、_Host.cshtmlとError.cshtmlがあって、これらはRazorPageです。これが同じPagesフォルダにあるので、RazorPageとBlazorServerの関係、境界が曖昧になり、混乱の元になっている気がします。
BlazorServerプロジェクトも、RazorPageプロジェクトと同じAsp.NET Coreサイトプロジェクトで、そのあるひとつのRazorPage(_Host.cshtml)でホストされるのがBlazorServerということです。RazorPageプロジェクトの上にBlazorServerが乗っかっている関係ですね。RazorPageプロジェクトとして開始して、後からBlazorServerを追加できるということです。NextやNuxtがサイト構築ツールであるのとは少し違う感じがします。BlazorServerは、Asp.NET CoreサイトでホストするひとつのSPAと考えたほうがわかりやすそうです。
VisualStudioで、TemplateからRazorPageプロジェクトとBlazorServerプロジェクトをそれぞれ作成すると、Program.csは次のようになります。
RazorPageプロジェクトのProgram.cs
builder.Services.AddRazorPages();
app.MapRazorPages();
BlazorServerプロジェクトのProgram.cs
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
わからないのは、BlazorServerプロジェクトには、app.MapRazorPagesがないことです。app.MapRazorPagesがないのにRazor Pageが機能するのはどうゆうことでしょう?どうも、 MapFallbackToPageがそれを兼ねているということらしいです。なのでMapRazorPagesはあっても問題はないが、なくても良いので書かれていないだけ!ということですね。このあたりも、きちんとした説明がないとコードを見ただけでは推測できず混乱の素になります。
さて、"/_Host"はフォールバックルートと言って、ルート照合では低い優先順位になるらしいです。つまり、RazorPageに該当するルートがあればそのエンドポイントが選択され、一致するものがなければBlazorに渡されるということです。BlazorServerプロジェクトを認証機能ありで開始するとログインページはBlazorの外側にRazorPageで準備されます。Blazorへのログインではなくてサイトへのログインということなのでしょう。とにかくこれで関係がすっきりしました。