從 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

必要條件

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

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

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

更新目標架構

如果更新 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 套件快取。

Blazor5.0.1 中的應用程式路由邏輯變更,以及 5.x 版最多 6.0 版

ASP.NET Core 5.0.1 修補程式版本中變更路由優先順序的計算。 如果您已使用選擇性參數定義全部攔截路由或路由,這可能會影響您。

舊的行為

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

新的行為

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

變更的原因

原始行為會被視為實作中的錯誤,因為我們的目標是 Blazor 路由系統的行為方式,與路由所 Blazor 支援功能子集的 ASP.NET Core路由系統相同。

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

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

當 設定為 @truePreferExactMatches ,路由比對偏好完全相符專案,而非萬用字元。

重要

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

只有提供設定為 PreferExactMatches@false 或保持未設定的功能 ,才能進行回溯相容性

發行 .NET 6 時,路由器一律會偏好完全相符專案,而且 PreferExactMatches 選項將無法使用。

更新 Blazor WebAssembly 和 Blazor Server 專案

本節中的指引適用于這兩個 Blazor 裝載模型。 本節後面的各節提供裝載模型和應用程式類型的特定其他指引。 將所有相關區段的指引套用至您的應用程式。

  1. Blazor WebAssembly在 wwwroot/index.html 應用程式或 Pages/_Host.cshtmlBlazor 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> 屬性設定 pageclass 的專案:

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

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

    @import url('open-iconic/font/css/open-iconic-bootstrap.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;
    }
    

更新 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 中,將元件 <div> 載入 App 至已設定為 app 的專案 id

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

    • 選擇性地取代 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 入口網站 中註冊的獨立 Blazor WebAssembly 應用程式,使用適用于 Microsoft 帳戶的 Azure Active Directory (AAD) :

  • 應用程式需要 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 獨立應用程式

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

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

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

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

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

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

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

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

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

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

  • 應用程式需要 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 獨立應用程式

使用 Azure Active Directory (AAD) 或 AAD B2C 裝載 Blazor WebAssembly 的應用程式

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

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

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

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

如需詳細資訊,請參閱

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

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

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

此外, Server 使用 Azure Active Directory (AAD) 或 B2C 向用戶端應用程式 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}" />

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

注意

託管 Blazor WebAssembly 方案中專案的 SDK Server 會維持 : 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 應用程式:

Azure Active Directory (AAD) 未經授權的用戶端

升級 Blazor WebAssembly 使用 AAD 進行驗證的應用程式之後,在使用者以 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 () 或 Pages/_Host.cshtml () Blazor Server 包含舊版 5.0 預覽版的 scoped.styles.css 樣式表單 <link> 元素,請移除 <link>Blazor WebAssembly 標記:

-<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 執行時間的基底映射。 請考慮下列 docker pull ASP.NET Core 3.1 與 5.0 之間的命令差異:

- 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/coremcr.microsoft.com/dotnet 移至 。 如需詳細資訊,請參閱 dotnet/dotnet-docker#1939

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

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

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

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

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

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現在已過時,應該以 和 UseMigrationsEndPoint 的組合 AddDatabaseDeveloperPageExceptionFilter 取代,如下列程式碼所示:

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 。ASP.NET Core 3.1 到 5.0 的 Web:

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

檢閱重大變更

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