從 ASP.NET Core 3.1 移轉至 5.0

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

必要條件

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

如果您依賴 global.json 檔案來以特定 .NET Core SDK 版本為目標,請將 version 屬性更新為已安裝的 .NET 5.0 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 套件快取。

變更 5.0.1 及更新版本 5.x (最高到 6.0) 中的 Blazor 應用程式路由邏輯

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

舊的行為

在 ASP.NET Core 5.0.0 或更早版本的先前行為中,優先順序較低的路由 (例如 {*slug}) 會比優先順序較高的路由 (例如 /customer/{id}) 先進行比對。

新的行為

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

變更原因

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

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

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

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

重要

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

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

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

更新 Blazor WebAssembly 和 Blazor Server 專案

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

  1. 在 Blazor WebAssembly 應用程式的 wwwroot/index.html 或 Blazor Server 應用程式的 Pages/_Host.cshtml 中,將 <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" />
    

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

    +<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 標記放在已將 class 屬性設定為 page<div> 元素之間:

    <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. Blazor WebAssembly 應用程式的最新基底 wwwroot/css/app.css 檔案或 Blazor Server 應用程式的 wwwroot/css/site.css 檔案會包含下列樣式。 移除額外樣式,並保留下列樣式及您已新增至應用程式的任何樣式。

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

    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 圖示 (open-iconic-bootstrap.css) (由 Blazor 專案範本提供) 的 @import 指示詞。 Open Iconic 已被其維護者放棄。

更新 Blazor WebAssembly 專案

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

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

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

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

    注意

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

  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 元件的元素變更為已將 id 設定為 app<div> 元素:

    -<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. 在託管 Blazor 解決方案的 Client 應用程式的 Program.Main (Program.cs) 中:

    • 選擇性地取代用戶端基底位址 (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 進行使用者驗證的託管 Blazor 解決方案的Client 應用程式註冊應該使用單頁應用程式 Azure Apps 平台設定。

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

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

如需詳細資訊,請參閱

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

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

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

此外,使用 Microsoft Entra ID (ME-ID) 或 B2C 向用戶端 Blazor WebAssembly 應用程式驗證使用者的Server 專案應該採用新的 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} 預留位置的套件版本:

注意

託管 Blazor WebAssembly 解決方案中 Server 專案的 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] Authorization failed. 不符合以下需求: 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 預覽版本中 scoped.styles.css 的樣式表 <link> 元素,請移除 <link> 標記:

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

更新 Razor 類別庫 (RCL)

移轉 Razor 類別庫 (RCL) 以利用在 ASP.NET Core 5.0 中引進的新 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 陳述式和指令碼。 使用包含 ASP.NET Core 5.0 執行階段的基底映像。 請考慮 ASP.NET Core 3.1 和 5.0 之間的下列 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 時區。

在 ASP.NET Core 5.0 和更新版本中,模型繫結會一致地繫結 DateTime 值與 UTC 時區。

若要保留先前的行為,請移除 Startup.ConfigureServices 中的 DateTimeModelBinderProvider

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace 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();
    }

如需詳細資訊,請參閱這個 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 的命名空間變更。

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

移轉 Microsoft.Identity.Web

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

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

檢閱中斷性變更

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