共用方式為


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

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

必要條件

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

如果您依賴global.json檔案來鎖定特定的.NET Core SDK版本,請將version屬性更新為您已安裝的.NET 5 SDK版本。 例如:

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

更新目標 Framework

如果更新 Blazor WebAssembly 專案,請跳至更新 Blazor WebAssembly 專案區段。 對於任何其他 ASP.NET Core 專案類型,請將專案檔的目標 Framework Moniker (TFM) 更新為 net5.0

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

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

</Project>

刪除 binobj 資料夾

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

Blazor 應用程式路由邏輯在 5.0.1 及其後續的 .NET 5.x 版本(直到 .NET 6)的變更

路由優先順序的計算在5.0.1修補程式版本中已變更。 如果您已定義全部擷取 (catch-all) 路由或具有選擇性參數的路由,則這可能會影響您。

舊的行為

在 5.0.0 或更早版本的先前設計中,優先順序較低的路由,例如 {*slug},會在優先順序較高的路由之前比對,例如 /customer/{id}

新的行為

5.0.1 或更新版本中的新行為會更緊密地符合 ASP.NET Core 應用程式中定義的路由行為,其中架構會先計算併為每個區段建立路由優先順序,並且只會使用路由的長度來中斷系結作為次要準則。

變更原因

原始行為在實作中被視為錯誤 (bug),因為我們的目標是讓 Blazor 路由系統的行為如同 ASP.NET Core 路由系統,使 Blazor 路由可支援功能子集。

PreferExactMatches 屬性新增至 Router 檔案中的 App.razor 元件,以選擇加入正確的行為:

<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">

PreferExactMatches 設為 @true 時,路由比對會優先使用完全相符而非萬用字元。

重要

所有應用程式都應該明確地將 PreferExactMatches 設定為 @true

PreferExactMatches 設定為 @false 或保持未設定的功能僅可針對回溯相容性提供

發行 .NET 6 時,路由器一律會以完全相符為優先,而且無法使用 PreferExactMatches 選項。

更新 Blazor WebAssembly 和 Blazor Server 專案

本節中的指引可用於這兩個 Blazor 裝載模型。 本節之後的各節則會提供專用於裝載模型和應用程式類型的其他指引。 請為您的應用程式套用所有相關區段的指引。

  1. wwwroot/index.html 應用程式的 Blazor WebAssembly 或 Pages/_Host.cshtml 應用程式的 Blazor Server 中,將 <link> 元素新增至樣式的 <head> 元素。 在下列 <link> 元素的 href 屬性值中,預留位置 {ASSEMBLY NAME} 是應用程式的組件名稱。

    +<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet" />
    

    獨立的 Blazor WebAssembly 或 Blazor Server 範例:

    +<link href="BlazorSample.styles.css" rel="stylesheet" />
    

    託管 Client 解決方案範例的 Blazor WebAssembly 專案:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. 在應用程式的 _Imports.razor 檔案中包含新的命名空間,以用於元件虛擬化 (Microsoft.AspNetCore.Components.Web.Virtualization)。 下列 _Imports.razor 檔案會顯示 Blazor 專案範本所產生應用程式中的預設命名空間。 預留位置 {ASSEMBLY NAME} 是應用程式的組件名稱。

    Blazor WebAssembly (_Imports.razor):

    @using System.Net.Http
    @using System.Net.Http.Json
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.AspNetCore.Components.WebAssembly.Http
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    

    Blazor Server (_Imports.razor):

    @using System.Net.Http
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Authorization
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    
  3. MainLayout 元件 (Shared/MainLayout.razor) 中,將元件的 HTML 標記放在已將 <div> 屬性設定為 classpage 元素之間:

    <div class="page">
    
        ...
    
    </div>
    
  4. 將下列檔案新增至 Shared 資料夾:

    MainLayout.razor.css

    .page {
        position: relative;
        display: flex;
        flex-direction: column;
    }
    
    .main {
        flex: 1;
    }
    
    .sidebar {
        background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
    }
    
    .top-row {
        background-color: #f7f7f7;
        border-bottom: 1px solid #d6d5d5;
        justify-content: flex-end;
        height: 3.5rem;
        display: flex;
        align-items: center;
    }
    
        .top-row ::deep a, .top-row .btn-link {
            white-space: nowrap;
            margin-left: 1.5rem;
        }
    
        .top-row a:first-child {
            overflow: hidden;
            text-overflow: ellipsis;
        }
    
    @media (max-width: 767.98px) {
        .top-row:not(.auth) {
            display: none;
        }
    
        .top-row.auth {
            justify-content: space-between;
        }
    
        .top-row a, .top-row .btn-link {
            margin-left: 0;
        }
    }
    
    @media (min-width: 768px) {
        .page {
            flex-direction: row;
        }
    
        .sidebar {
            width: 250px;
            height: 100vh;
            position: sticky;
            top: 0;
        }
    
        .top-row {
            position: sticky;
            top: 0;
            z-index: 1;
        }
    
        .main > div {
            padding-left: 2rem !important;
            padding-right: 1.5rem !important;
        }
    }
    

    NavMenu.razor.css

    .navbar-toggler {
        background-color: rgba(255, 255, 255, 0.1);
    }
    
    .top-row {
        height: 3.5rem;
        background-color: rgba(0,0,0,0.4);
    }
    
    .navbar-brand {
        font-size: 1.1rem;
    }
    
    .oi {
        width: 2rem;
        font-size: 1.1rem;
        vertical-align: text-top;
        top: -2px;
    }
    
    .nav-item {
        font-size: 0.9rem;
        padding-bottom: 0.5rem;
    }
    
        .nav-item:first-of-type {
            padding-top: 1rem;
        }
    
        .nav-item:last-of-type {
            padding-bottom: 1rem;
        }
    
        .nav-item ::deep a {
            color: #d7d7d7;
            border-radius: 4px;
            height: 3rem;
            display: flex;
            align-items: center;
            line-height: 3rem;
        }
    
    .nav-item ::deep a.active {
        background-color: rgba(255,255,255,0.25);
        color: white;
    }
    
    .nav-item ::deep a:hover {
        background-color: rgba(255,255,255,0.1);
        color: white;
    }
    
    @media (min-width: 768px) {
        .navbar-toggler {
            display: none;
        }
    
        .collapse {
            /* Never collapse the sidebar for wide screens */
            display: block;
        }
    }
    
  5. wwwroot/css/app.css 應用程式的最新基底 Blazor WebAssembly 檔案或 wwwroot/css/site.css 應用程式的 Blazor Server 檔案會包含下列樣式。 移除額外樣式,並保留下列樣式及您已新增至應用程式的任何樣式。

    下列樣式表只包含基底樣式,包含開發人員新增的自訂樣式:

    html, body {
        font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    }
    
    a, .btn-link {
        color: #0366d6;
    }
    
    .btn-primary {
        color: #fff;
        background-color: #1b6ec2;
        border-color: #1861ac;
    }
    
    .content {
        padding-top: 1.1rem;
    }
    
    .valid.modified:not([type=checkbox]) {
        outline: 1px solid #26b050;
    }
    
    .invalid {
        outline: 1px solid red;
    }
    
    .validation-message {
        color: red;
    }
    
    #blazor-error-ui {
        background: lightyellow;
        bottom: 0;
        box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
        display: none;
        left: 0;
        padding: 0.6rem 1.25rem 0.7rem 1.25rem;
        position: fixed;
        width: 100%;
        z-index: 1000;
    }
    
    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
    

    注意

    上述範例不會顯示 Open Iconic 圖示 (@import) (由 open-iconic-bootstrap.css 專案範本提供) 的 Blazor 指示詞。 Open Iconic 已被其維護者放棄。

更新 Blazor WebAssembly 專案

請遵循上述更新 Blazor WebAssembly 和 Blazor Server 專案一節中的指引。

針對 Blazor WebAssembly 專案 (包括託管 Client 解決方案的 Blazor 專案),將下列變更套用至專案檔:

  1. 將 SDK 從 Microsoft.NET.Sdk.Web 更新為 Microsoft.NET.Sdk.BlazorWebAssembly

    - <Project Sdk="Microsoft.NET.Sdk.Web">
    + <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    

    注意

    此更新僅適用於獨立的 Blazor WebAssembly 專案和託管 Client 解決方案的 Blazor 專案。

  2. 更新下列屬性:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. 移除 Microsoft.AspNetCore.Components.WebAssembly.Build 的套件參考:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. 將其他套件更新為其最新版本。 您可以在 NuGet.org 中找到最新版本。

  5. wwwroot/index.html 中,將載入 App 元件的元素變更為已將 <div> 設定為 idapp 元素:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Program.Main (Program.cs) 中,藉由加上井字號 <app>,將 # 元素的參考變更為 CSS 選取器:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Program.Main (Program.cs) 中,將預設的暫時性 HttpClient 註冊變更為限定範圍 (如果有的話):

    -builder.Services.AddTransient(sp => new HttpClient 
    -    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    +builder.Services.AddScoped(sp => new HttpClient 
    +    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
  8. 在託管 Program.Main 解決方案的 Program.cs 應用程式的 Client (Blazor) 中:

    • 選擇性地取代用戶端基底位址 (Base Address) 字串的 builder.HostEnvironment.BaseAddress
    • 將任何具名的暫時性用戶端處理站註冊變更為限定範圍。
    -builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    -    client => client.BaseAddress = new Uri("https://localhost:5001"))
    -    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    -builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>()
    -    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    +builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    +    client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    +    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    +builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    +    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    

    在上述程式碼中,{APP NAMESPACE} 預留位置是應用程式的命名空間。

使用 Microsoft 帳戶的獨立 Blazor WebAssembly 應用程式

請遵循上述更新 Blazor WebAssembly 和 Blazor Server 專案更新 Blazor WebAssembly 專案章節中的指引。

對於在 Azure 入口網站中註冊以針對 Microsoft 帳戶使用 Microsoft Entra ID (ME-ID) 的獨立 Blazor WebAssembly 應用程式:

  • 應用程式需要 openidoffline_access 範圍:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • 在 Azure 入口網站應用程式註冊的 [驗證] 刀鋒視窗中:

    1. 移除 Web 平台設定。
    2. 使用應用程式的重新導向 URI 新增單頁應用程式平台設定。
    3. 停用存取權杖識別碼權杖隱含授與

如需詳細資訊,請參閱使用 Microsoft 帳戶保護 ASP.NET Core Blazor WebAssembly 獨立應用程式

使用 Microsoft Entra ID (ME-ID) 的獨立 Blazor WebAssembly 應用程式

請遵循上述更新 Blazor WebAssembly 和 Blazor Server 專案更新 Blazor WebAssembly 專案章節中的指引。

對於在 Azure 入口網站中註冊以使用 Microsoft Entra ID (ME-ID) 的獨立 Blazor WebAssembly 應用程式:

  • 應用程式需要 https://graph.microsoft.com/User.Read 範圍:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • 在 Azure 入口網站應用程式註冊的 [驗證] 刀鋒視窗中:

    1. 移除 Web 平台設定。
    2. 使用應用程式的重新導向 URI 新增單頁應用程式平台設定。
    3. 停用存取權杖識別碼權杖隱含授與

如需詳細資訊,請參閱使用 Microsoft Entra ID 保護 ASP.NET Core Blazor WebAssembly 獨立應用程式

使用 Azure Active Directory (AAD) B2C 的獨立Blazor WebAssembly 應用程式

請遵循上述更新 Blazor WebAssembly 和 Blazor Server 專案更新 Blazor WebAssembly 專案章節中的指引。

針對在 Azure 入口網站中註冊以使用 Azure Active Directory (AAD) B2C 的獨立 Blazor WebAssembly 應用程式:

  • 應用程式需要 openidoffline_access 範圍:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • 在 Azure 入口網站應用程式註冊的 [驗證] 刀鋒視窗中:

    1. 移除 Web 平台設定。
    2. 使用應用程式的重新導向 URI 新增單頁應用程式平台設定。
    3. 停用存取權杖識別碼權杖隱含授與

如需詳細資訊,請參閱使用 Azure Active Directory B2C 保護 ASP.NET Core Blazor WebAssembly 獨立應用程式

裝載的 Blazor WebAssembly 應用程式搭配 Microsoft Entra ID (ME-ID) 或 AAD B2C

請遵循上述更新 Blazor WebAssembly 和 Blazor Server 專案更新 Blazor WebAssembly 專案章節中的指引。

使用 AAD 或 AAD B2C 進行使用者驗證的託管 Client 解決方案的Blazor 應用程式註冊應該使用單頁應用程式 Azure Apps 平台設定。

在 Azure 入口網站中 Client 應用程式註冊的 [驗證] 刀鋒視窗中:

  1. 移除 Web 平台設定。
  2. 使用應用程式的重新導向 URI 新增單頁應用程式平台設定。
  3. 停用存取權杖識別碼權杖隱含授與

如需詳細資訊,請參閱

更新託管 Blazor 解決方案的伺服器專案

請遵循上述各節中的指引:

依照本文中的一般指引,將託管 Server 解決方案的 Blazor 專案更新為 ASP.NET Core 應用程式。

此外,使用 Microsoft Entra ID (ME-ID) 或 B2C 向用戶端 Server 應用程式驗證使用者的Blazor WebAssembly 專案應該採用新的 Microsoft Identity v2.0 套件:

針對 AAD:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

針對 AAD B2C:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

針對上述套件參考,判斷 NuGet.org 上 {VERSION} 預留位置的套件版本:

注意

託管 Server 解決方案中 Blazor WebAssembly 專案的 SDK 會維持 Microsoft.NET.Sdk.Web

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

如需詳細資訊,請參閱

清除並重建解決方案

將應用程式或解決方案移轉至 .NET 5 之後,請清除並重建應用程式或解決方案。 如果新的套件參考與快取套件之間存在套件不相容的情況:

  1. 在命令殼層中執行下列 dotnet nuget locals 命令,以清除 NuGet 套件快取:

    dotnet nuget locals --clear all
    
  2. 清除並重建應用程式或解決方案。

疑難排解

請遵循您應用程式適用的 安全性主題最後的Blazor WebAssembly指引:

獨立 Blazor WebAssembly 應用程式:

裝載的 Blazor WebAssembly 應用程式:

Microsoft Entra ID (ME-ID) 的未經授權用戶端

升級使用 AAD 進行驗證的 Blazor WebAssembly 應用程式之後,在使用者以 AAD 登入之後,您可能會在應用程式的登入回呼上收到下列錯誤:

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 授權失敗。 不符合以下需求: DenyAnonymousAuthorizationRequirement:需要已驗證的使用者。

AAD 的登入回呼錯誤:

  • 錯誤: unauthorized_client
  • 描述:AADB2C90058: The provided application is not configured to allow public clients.

若要解決此錯誤:

  1. 在 Azure 入口網站中,存取應用程式的資訊清單
  2. allowPublicClient 屬性設定為 nulltrue

更新 Blazor 漸進式 Web 應用程式 (PWA)

將下列項目新增至 PWA 應用程式的專案檔:

<ItemGroup>
  <ServiceWorker Include="wwwroot\service-worker.js" 
    PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>

如果專案的 wwwroot/index.html (Blazor WebAssembly) 或 Pages/_Host.cshtml (Blazor Server) 包含舊版 5.0 預覽版本中 <link> 的樣式表 scoped.styles.css 元素,請移除 <link> 標記:

-<link href="_framework/scoped.styles.css/" rel="stylesheet" />

更新 Razor 類別庫 (RCL)

遷移 Razor 類別庫(RCL),以利用 .NET 5 隨 ASP.NET Core 一同推出的新 API 或功能。

若要更新以元件為目標的 RCL:

  1. 更新專案檔中的下列屬性:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. 將其他套件更新為其最新版本。 您可以在 NuGet.org 中找到最新版本。

若要更新以 MVC 為目標的 RCL,請在專案檔中更新下列屬性:

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

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

更新套件參考

在專案檔中,將每個 Microsoft.AspNetCore.*Microsoft.EntityFrameworkCore.*Microsoft.Extensions.*System.Net.Http.Json 套件參考的 Version 屬性更新為 5.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="5.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
</ItemGroup>

更新 Docker 映像

針對使用 Docker 的應用程式,請更新 DockerfileFROM 陳述式和指令碼。 使用包含 .NET 5 運行時間的基底映像。 請考慮 ASP.NET Core 3.1 與 .NET 5 之間的下列 docker pull 命令差異:

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

在移至 ".NET" 以作為產品名稱的一部分中,Docker 映像會從 mcr.microsoft.com/dotnet/core 存放庫移至 mcr.microsoft.com/dotnet。 如需詳細資訊,請參閱 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();
    }

如需詳細資訊,請參閱這個 GitHub 問題。

ASP.NET Core 模組 (ANCM)

如果在安裝 Visual Studio 時,ASP.NET Core 模組 (ANCM) 不是選取的元件,或者如果系統上已安裝舊版的 ANCM,請下載最新的 .NET Core 裝載套件組合安裝程式 (直接下載),並執行安裝程式。 如需詳細資訊,請參閱裝載組合套件

影響某些 NuGet 套件的套件參考變更

將某些 Microsoft.Extensions.* NuGet 套件從 dotnet/extensions 存放庫移轉至 dotnet/runtime 後 (如將 dotnet/extensions 內容移轉至 dotnet/runtime 和 dotnet/aspnetcore (aspnet/Announcements #411) 中所述),封裝變更會套用至某些已移轉的套件。 這些變更通常會導致 .NET API 的命名空間變更。

若要在移轉至 .NET 5 時進一步研究應用程式命名空間變更的 API,請使用 .NET API 瀏覽器

移轉 Microsoft.Identity.Web

下列 Wiki 頁面說明如何將 Microsoft.Identity.Web 從 ASP.NET Core 3.1 遷移至 .NET 5:

下列教學課程也會說明移轉:

檢閱中斷性變更

如需從 .NET Core 3.1 到 .NET 5 的重大變更,請參閱 從 3.1 版移轉至 5.0 的重大變更。 ASP.NET Core 和 Entity Framework Core 也包含在此清單中。