次の方法で共有


.NET 6 .NET 7 の ASP.NET Core から移行する

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

Prerequisites

で .NET SDK のバージョンを更新する global.json

特定の .NET SDK バージョンを対象とする global.json ファイルに依存している場合は、 version プロパティをインストールされている .NET 7 SDK バージョンに更新します。 For example:

{
  "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 以降に更新します。 For example:

<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 機能を採用する

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

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 へのログインの成功後に元のページへのリダイレクトが失敗します。

次の例は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)}");
    }
}

次の例を対象とするアプリの新しいリダイレクト アプローチを示します。

@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 に置き換えられました。

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

@inject SignOutSessionStateManager SignOutManager

...

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

次の例は、Shared/LoginDisplay.razorを示しています。 @inject の挿入 (SignOutSessionStateManager) は、ファイルの先頭にあるコンポーネントのディレクティブから削除され、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 ステートメントとスクリプトを更新します。 .NET 7 ランタイムの ASP.NET Core を含む基本イメージを使用します。 .NET 6 と .NET 7 の ASP.NET Core の docker pull コマンドの違いを考えてみましょう。

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

破壊的変更の確認

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