🎉

.NET 8 -> 10 移行メモ(Blazor Web App/Server)

に公開

はじめに

これは、Blazor Web App (Server) を、.NET 8 から .NET 10 へ移行した際に施した処置のメモです。

対象アプリと環境

https://github.com/tetr4lab/ExLibris10

https://zenn.dev/tetr4lab/articles/3fb1d4e8e7ff21

その他

変更点

ターゲットフレームワーク

当たり前の話ではありますが、一応、念のため。

Project.csproj
 <Project Sdk="Microsoft.NET.Sdk.Web">
   <PropertyGroup>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net10.0</TargetFramework>
     <Nullable>enable</Nullable>
     <ImplicitUsings>enable</ImplicitUsings>
   <ItemGroup>
~
   </ItemGroup>
~
 </Project>

スタートアップ・プロセス

  • SignalR_blazor/negotiateは、ベースパスを考慮しないため、UsePathBaseだけだとルートに配置されてしまいます。
    • アプリをサブパスにデプロイする場合に必要な措置で、ルートに配置する場合は不要です。
  • UseStaticFilesMapStaticAssets置き換わりました。(.NET 9)
Program.cs
~
-var basePath = builder.Configuration ["AppBasePath"];
+var basePath = builder.Configuration ["AppBasePath"]?.TrimEnd ('/');
 if (!string.IsNullOrEmpty (basePath)) {
     app.UsePathBase (basePath);
+    app.MapBlazorHub ($"{basePath}/_blazor");
 }
~
-app.UseStaticFiles ();
+app.MapStaticAssets ();
~

ベースコンポーネント

  • Assets["~"]は、MapStaticAssetsと連動して、静的アセットへの適正なパスを生成します。(.NET 9)
    • @Assets ["~"]だと、@の適用範囲でエラーします。@(Assets ["~"])なら大丈夫ですね。
  • ResourcePreloaderは、静的アセットのプリロードで、ベースパス構成のおまじないみたいです。(理解してないけど、重要なのは<base href="~" />の直後に置くことです。)
  • ImportMapは、クライアント側のフィンガープリントのおまじないらしいです。
App.razor
~
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <base href="@basePath" />
+    <ResourcePreloader />
-    <link rel="stylesheet" href="app.css" />
-    <link rel="stylesheet" href="Project.styles.css" />
+    <link rel="stylesheet" href="@Assets["app.css"]" />
+    <link rel="stylesheet" href="@Assets["Project.styles.css"]" />
     <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
-    <link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
+    <link href="@Assets["_content/MudBlazor/MudBlazor.min.css"]" rel="stylesheet" />
+    <ImportMap />
     <link rel="icon" type="image/png" href="favicon.png" />
     <HeadOutlet />
 </head>
  <body>
     <Routes @rendermode="RenderMode.InteractiveServer" />
-    <script src="_framework/blazor.web.js"></script>
-    <script src="_content/MudBlazor/MudBlazor.min.js"></script>
-    <script src="js/ProjectUtilities.js"></script>
+    <script src="@Assets["_framework/blazor.web.js"]"></script>
+    <script src="@Assets["_content/MudBlazor/MudBlazor.min.js"]"></script>
+    <script src="@Assets["js/ProjectUtilities.js"]"></script>
 </body>
</html>
basePath

アプリをサブパスにデプロイする場合に必要な措置で、ルートに配置する場合は不要です。

App.razor.cs
    /// <summary>ベースパス</summary>
    protected string basePath = "/";

    /// <summary>初期化</summary>
    protected override void OnInitialized () {
        base.OnInitialized ();
        basePath = Config.GetValue<string> ("AppBasePath") ?? "/";
        if (!string.IsNullOrEmpty (basePath) && !basePath.EndsWith ('/')) {
            basePath += '/';
        }
    }

補足

以下は、.NET移行と関係ありません。

ログインで「このブラウザまたはアプリは安全でない可能性があります。」

launchSettings.jsonに以下の値が不足している可能性があります。

launchSettings.json
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"

https://learn.microsoft.com/ja-jp/aspnet/core/blazor/debug?view=aspnetcore-9.0&tabs=visual-studio#app-configuration-prerequisites

デバッグにWSLを使っている場合は、いったんhttpsに切り替えることで、ログインできる可能性があります。
いちどログインすれば、WSLに戻しても問題なく使用できます。

複数のWSLからデバッグ環境を選択する

WSL2のUbuntu(22)を24にしようとして、なんだか面倒なことになったので、Debian(13)に入れ直しました。
引っ越しはDBのダンプとロードくらいでした。(何か忘れてなければ…)
まだ、Ubuntuも消してないので、launchSettings.json"distributionName": "Debian"が必要です。

https://learn.microsoft.com/ja-jp/visualstudio/debugger/debug-dotnet-core-in-wsl-2?view=visualstudio#choose-a-specific-distribution

資料

https://learn.microsoft.com/ja-jp/aspnet/core/migration/80-to-90?view=aspnetcore-10.0&tabs=visual-studio

https://learn.microsoft.com/ja-jp/aspnet/core/release-notes/aspnetcore-9.0?view=aspnetcore-10.0

https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/9.0?toc=%2Faspnet%2Fcore%2Ftoc.json&bc=%2Faspnet%2Fcore%2Fbreadcrumb%2Ftoc.json&view=aspnetcore-10.0#aspnet-core

https://learn.microsoft.com/ja-jp/aspnet/core/migration/90-to-100?view=aspnetcore-10.0&tabs=visual-studio

https://learn.microsoft.com/ja-jp/aspnet/core/release-notes/aspnetcore-10.0?view=aspnetcore-10.0

https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/10.0?toc=%2Faspnet%2Fcore%2Ftoc.json&bc=%2Faspnet%2Fcore%2Fbreadcrumb%2Ftoc.json&view=aspnetcore-10.0#aspnet-core

おわりに

最後までお読みいただきありがとうございました。
何かお気づきの際は、是非ご指摘ください。

Discussion