次の方法で共有


ASP.NET Core 6.0 から 7.0 への移行

この記事では、既存の ASP.NET Core 6.0 プロジェクトを ASP.NET Core 7.0 に更新する方法について説明します。

前提条件

global.json での .NET Core SDK バージョンの更新

特定の .NET Core SDK バージョンを対象とする global.json ファイルを使用する場合は、version プロパティを、インストールされる .NET 7.0 SDK バージョンに更新します。 次に例を示します。

{
  "sdk": {
-    "version": "6.0.200"
+    "version": "7.0.100"
  }
}

ターゲット フレームワークを更新する

プロジェクト ファイルのターゲット フレームワーク モニカー (TFM)net7.0 に更新します。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>

</Project>

パッケージ参照の更新

プロジェクト ファイルで、Microsoft.AspNetCore.*Microsoft.EntityFrameworkCore.*Microsoft.Extensions.*System.Net.Http.Json の各パッケージ参照の Version 属性を 7.0.0 以降に更新します。 次に例を示します。

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.9" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.9" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.9" />
-    <PackageReference Include="System.Net.Http.Json" Version="6.0.0" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="7.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="7.0.0" />
</ItemGroup>

Blazor

.NET 7 機能を採用する

この記事の前半のガイダンスに従ってアプリを 7.0 に更新した後、「ASP.NET Core 7.0 の新機能」のリンクに従って、特定の機能を採用します。

Blazor アプリに 7.0 の新機能をすべて導入するには、次のプロセスを実行することをお勧めします。

  • Blazor プロジェクト テンプレートの 1 つから新しい 7.0 Blazor プロジェクトを作成します。 詳しくは、「ASP.NET Core Blazor 用のツール」をご覧ください。
  • アプリのコンポーネントとコードを 7.0 アプリに移動して、7.0 の新機能を導入するように変更します。

コンポーネント パラメーターのバインドを簡略化する

以前の Blazor リリースでは、複数のコンポーネント間でバインドするには、 get/set アクセサーを使用したプロパティへのバインドが必要でした。

.NET 6 以前の場合:

<NestedGrandchild @bind-GrandchildMessage="BoundValue" />

@code {
    ...

    private string BoundValue
    {
        get => ChildMessage ?? string.Empty;
        set => ChildMessageChanged.InvokeAsync(value);
    }
}

.NET 7 では、新しい @bind:get および @bind:set 修飾子を使用して双方向データ バインディングをサポートし、バインド構文を簡略化できます。

<NestedGrandchild @bind-GrandchildMessage:get="ChildMessage" 
    @bind-GrandchildMessage:set="ChildMessageChanged" />

詳しくは、データ バインディングに関する記事の、次の内容をご覧ください。

マーシャリングされていない JavaScript 相互運用の移行

IJSUnmarshalledRuntime インターフェイスを使用したマーシャリング解除された相互運用は廃止されており、JavaScript [JSImport]/[JSExport] 相互運用機能に置き換える必要があります。

詳細については、「ASP.NET Core Blazor を使用した JavaScript [JSImport]/[JSExport] 相互運用」をご覧ください。

Blazor WebAssembly 認証では、リダイレクトに履歴状態が使用されます

Blazor WebAssembly アプリでの認証のサポートが変更され、URL のクエリ文字列ではなくナビゲーション履歴状態に依存するようになりました。 その結果、クエリ文字列を介して戻り先 URL を渡すと、.NET 7 へのログインの成功後に元のページへのリダイレクトが失敗します。

次の例はNavigateToを使用したリダイレクト URL (?returnUrl=) に基づくRedirectToLogin.razorの .NET 6 以前を対象とするアプリの以前のリダイレクト アプローチを示しています。

@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo(
            $"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
    }
}

次の例NavigateToLoginナビゲーション履歴の状態に基づくRedirectToLogin.razorの .NET 7 以降を対象とするアプリの新しいリダイレクト アプローチを示します。

@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Microsoft.Extensions.Options

@inject IOptionsSnapshot<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>> OptionsSnapshot
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateToLogin(OptionsSnapshot.Get(Options.DefaultName).AuthenticationPaths.LogInPath);
    }
}

この変更の一環として、SignOutSessionStateManager は .NET 7 以降で廃止され、NavigateToLogout に置き換えられました。

次の例は、Blazor WebAssembly プロジェクト テンプレートから生成されたアプリの Shared/LoginDisplay.razor での以前のアプローチを示しています。

@inject SignOutSessionStateManager SignOutManager

...

@code{
    private async Task BeginLogout(MouseEventArgs args)
    {
        await SignOutManager.SetSignOutState();
        Navigation.NavigateTo("authentication/logout");
    }
}

次の例は、NavigateToLogout呼び出すShared/LoginDisplay.razorの新しいアプローチを示しています。 SignOutSessionStateManager の挿入 (@inject) は、ファイルの先頭にあるコンポーネントのディレクティブから削除され、BeginLogOut メソッドは次のコードに更新されます。

@code{
    public void BeginLogOut()
    {
        Navigation.NavigateToLogout("authentication/logout");
    }
}

SignOutSessionStateManager サービス登録は、Program.cs で削除されます。

- builder.Services.AddScoped<SignOutSessionStateManager>();

詳細については、次のリソースを参照してください。

.NET 6 プロジェクト用の .NET WebAssembly ビルド ツール

.NET 7 SDK を使用するときに、.NET 6 プロジェクトで .NET WebAssembly ビルド ツールを使用できるようになりました。 新しい wasm-tools-net6 ワークロードには、.NET 7 SDK で使用できるように、.NET 6 プロジェクト用の .NET WebAssembly ビルド ツールが含まれています。 既存の wasm-tools ワークロードでは .NET 7 プロジェクト用の .NET WebAssembly ビルド ツールをインストールします。 ただし、.NET 7 バージョンの .NET WebAssembly ビルド ツールは、.NET 6 でビルドされた既存のプロジェクトと互換性がありません。 .NET 6 と .NET 7 の両方をサポートすることが必要な .NET WebAssembly ビルド ツールを使用するプロジェクトでは、マルチターゲットを使用する必要があります。

Docker イメージの更新

Docker を使用するアプリの場合、DockerfileFROM ステートメントとスクリプトを更新します。 ASP.NET Core 7.0 ランタイムを含む基本イメージを使用します。 ASP.NET Core 6.0 と 7.0 の間では、docker pull コマンドに次の違いがあることに注意してください。

- docker pull mcr.microsoft.com/dotnet/aspnet:6.0
+ docker pull mcr.microsoft.com/dotnet/aspnet:7.0

破壊的変更の確認

.NET Core 6.0 から .NET 7.0 への破壊的変更については、「.NET 7 の破壊的変更」を参照してください。 一覧には、ASP.NET Core と Entity Framework Core も含まれます。