共用方式為


從 ASP.NET Core 3.1 移轉至 .NET 6

本文說明如何將現有的 ASP.NET Core 3.1 專案更新為 .NET 6 中的 ASP.NET Core。 若要從 .NET 5 中的 ASP.NET Core 升級至 .NET 6,請參閱 從 .NET 5 中的 ASP.NET Core 移轉至 .NET 6

必要條件

更新 global.json 中的 .NET SDK 版本

如果您依賴 global.json 檔案來指定一個特定的 .NET SDK 版本,請將 version 屬性更新為您所安裝的 .NET 6 SDK 版本。 例如:

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

更新目標 Framework

將專案檔的目標 Framework Moniker (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>

刪除 binobj 資料夾

您可能需要刪除 binobj 資料夾。 執行 dotnet nuget locals --clear all 以清除 NuGet 套件快取。

最小主控模型

ASP.NET Core 範本會使用新的最小主控模型來產生程式碼。 最小主控模型會將 Startup.csProgram.cs 統一成單一 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 中移轉至新的最小裝載模型從 .NET 5 中的 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 專案範本建立新的 6.0 Blazor 專案。 如需詳細資訊,請參閱 ASP.NET Core Blazor 工具。
  • 將應用程式的元件和程式碼移至 6.0 應用程式進行修改,以採用新的 5.0 和 6.0 功能。

更新 Docker 映像

針對使用 Docker 的應用程式,請更新 DockerfileFROM 陳述式和指令碼。 使用包含 ASP.NET Core 運行環境的 .NET 6 基礎映像。 請考慮 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 存放庫名稱變更 (dotnet/dotnet-docker #1939)

ASP.NET Core MVC 和 Razor Pages 中的模型繫結變更

DateTime 值是以 UTC 時間繫結的模型

在 ASP.NET Core 3.1 或更早版本中, DateTime 值會模型系結為本地時間,其中時區是由伺服器決定。 繫結自輸入格式設定 (JSON) 的 DateTime 數值和 DateTimeOffset 數值已繫結為 UTC 時區。

在 .NET 5 或更新版本中,模型系結會一致地系結 DateTime 與 UTC 時區的值。

若要保留先前的行為,請移除 DateTimeModelBinderProvider 中的 Startup.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 結尾。 大部分從 HostBuilderWebHostBuilder 移轉的應用程式都不會有相同的應用程式名稱,因為這些應用程式並未正規化。 如需詳細資訊,請參閱 SetApplicationName

重大突破性變更

使用 .NET 中的重大變更中的 文章,尋找將應用程式升級至較新版本的 .NET 時可能套用的重大變更。

如需詳細資訊,請參閱下列資源: