ASP.NET Core 6.0 から 7.0 への移行
この記事では、既存の ASP.NET Core 6.0 プロジェクトを ASP.NET Core 7.0 に更新する方法について説明します。
前提条件
Visual Studio 2022 と ASP.NET と Web 開発ワークロード。
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>();
詳細については、次のリソースを参照してください。
- [破壊的変更]: webassembly アプリケーションの認証に更新する
- ASP.NET Core の Blazor ルーティングとナビゲーション
- ASP.NET Core をセキュリティで保護するBlazor WebAssembly
- ASP.NET Core Blazor の認証と認可
.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 を使用するアプリの場合、Dockerfile の FROM
ステートメントとスクリプトを更新します。 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 も含まれます。
ASP.NET Core