次の方法で共有


ASP.NET Core 3.1 から .NET 6 に移行する

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

前提条件

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

特定の .NET SDK バージョンを対象とする global.json ファイルに依存している場合は、 version プロパティをインストールされている .NET 6 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 から .NET 6 に移行するアプリでは、最小限のホスティング モデルを使用する必要はありません。 Startup を使用すると、ASP.NET Core 3.1 テンプレートで使用される 汎用ホスト が完全にサポートされます。

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

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

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

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

コンポーネントを対象とする 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

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

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

Docker イメージの更新

Docker を使用するアプリの場合、DockerfileFROM ステートメントとスクリプトを更新します。 .NET 6 ランタイムの ASP.NET Core を含む基本イメージを使用します。 ASP.NET Core 3.1 と .NET 6 の 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 タイム ゾーンとしてバインドされました。

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

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

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder 置き換え ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

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

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

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

- 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」をご覧ください。

破壊的変更の確認

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