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

この記事では、既存の ASP.NET Core 3.1 プロジェクトを ASP.NET Core 6.0 に更新する方法について説明します。 ASP.NET Core 5.0 から 6.0 にアップグレードするには、「ASP.NET Core 5.0 から 6.0 に移行する」を参照してください。

前提条件

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

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

{
  "sdk": {
-    "version": "3.1.200"
+    "version": "6.0.100"
  }
}

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

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

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

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

</Project>

パッケージ参照の更新

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

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

bin フォルダーと obj フォルダーを削除する

bin および obj フォルダーの削除が必要になる場合があります。 dotnet nuget locals --clear all を実行して、NuGet パッケージ キャッシュを消去します。

最小ホスティング モデル

ASP.NET Core テンプレートは、新しい最小ホスティング モデルを使用してコードを生成します。 最小ホスティング モデルでは、Startup.csProgram.cs を 1 つの Program.cs ファイルに統合します。 ConfigureServicesConfigure は使用されなくなりました。 ASP.NET Core 3.1 から 6.0 に移行するアプリでは、Startup を使用して最小ホスティング モデルを使用する必要はありません。また、ASP.NET Core 3.1 テンプレートで使用される汎用ホストは完全にサポートされています。

新しい最小ホスティング モデルで Startup を使用するには、「新しい最小ホスティング モデルでスタートアップを使用する」を参照してください。

ASP.NET Core 6.0 テンプレートで使用される次のパターンを使用して新しい最小ホスティング モデルに移行するには、「ASP.NET Core 6.0 の新しい最小ホスティング モデルに移行されたコード サンプル」と「ASP.NET Core 5.0から 6.0 に移行する」を参照してください。

Razor クラス ライブラリ (RCL) を更新する

ASP.NET Core 6.0 の一部として導入された新しい API または機能を利用するため、Razor クラス ライブラリ (RCL) を移行します。

コンポーネントを対象とする RCL を更新するには:

  1. プロジェクト ファイルで次のプロパティを更新します。

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
  2. 他のパッケージを最新バージョンに更新します。 最新バージョンは、NuGet.org で確認できます。

MVC を対象とする RCL を更新するには、プロジェクト ファイルで次のプロパティを更新します。

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

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

Blazor

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

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

Docker イメージの更新

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

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

製品名が ".NET" に変わるのに伴い、Docker イメージは mcr.microsoft.com/dotnet/core リポジトリから mcr.microsoft.com/dotnet に移動されました。 詳細については、「.NET 5.0 - Docker Repo Name Change (dotnet/dotnet-docker #1939)」を参照してください。

ASP.NET Core MVC と Razor Pages でのモデル バインドの変更

DateTime 値は UTC 時刻としてモデル バインドされる

ASP.NET Core 3.1 以前では、DateTime 値はローカル時刻としてモデル バインドされ、タイム ゾーンはサーバーによって決定されました。 入力書式 (JSON) からバインドされた DateTime 値と DateTimeOffset 値は、UTC タイム ゾーンとしてバインドされました。

ASP.NET Core 5.0 以降のモデル バインドでは、DateTime 値は一貫して UTC タイム ゾーンとバインドされます。

以前の動作を維持するには、Startup.ConfigureServicesDateTimeModelBinderProvider を削除します。

services.AddControllersWithViews(options =>
    options.ModelBinderProviders.RemoveType<DateTimeModelBinderProvider>());

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder 置き換え ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

C# 9 レコード型のモデル バインドのサポートを追加するため、ComplexTypeModelBinderProvider は次のようになります。

  • 古い形式として注釈付けされます。
  • 既定では登録されなくなります。

ModelBinderProviders コレクションに ComplexTypeModelBinderProvider が存在することに依存するアプリでは、新しいバインダー プロバイダーを参照する必要があります。

- var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexTypeModelBinderProvider>();
+ var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexObjectModelBinderProvider>();

UseDatabaseErrorPage 非推奨

個々のユーザー アカウントに対するオプションが含まれる ASP.NET Core 3.1 のテンプレートでは、UseDatabaseErrorPage の呼び出しが生成されます。 UseDatabaseErrorPage は古くなり、次のコードに示すように、AddDatabaseDeveloperPageExceptionFilterUseMigrationsEndPoint の組み合わせに置き換える必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
+   services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
+       app.UseMigrationsEndPoint();
-       app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

詳細については、「Obsoleting DatabaseErrorPage ミドルウェア (dotnet/aspnetcore #24987)」を参照してください。

ASP.NET Core モジュール (ANCM)

Visual Studio のインストール時に ASP.NET Core モジュール (ANCM) が選択されたコンポーネントではなかった場合、または ANCM の以前のバージョンがシステムにインストールされていた場合は、最新の .NET Core ホスティング バンドル インストーラー (直接ダウンロード) をダウンロードし、インストーラーを実行します。 詳細については、「ホスティング バンドル」を参照してください。

アプリケーション名の変更

.NET 6 では、WebApplicationBuilder によって、コンテンツのルート パスが DirectorySeparatorChar で終わるように正規化されます。 HostBuilder または WebHostBuilder から移行するほとんどのアプリは正規化されないため、同じアプリ名を共有することはありません。 詳しくは、「SetApplicationName」をご覧ください。

破壊的変更の確認

次のリソースを参照してください。