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 バージョンの更新

特定の .NET Core SDK バージョンを対象とする global.json ファイルを使用する場合は、version プロパティを、インストールされる .NET 5.0 SDK バージョンに更新します。 次に例を示します。

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

ターゲット フレームワークを更新する

Blazor WebAssembly プロジェクトを更新する場合は、「Blazor WebAssembly プロジェクトを更新する」セクションに進みます。 その他の ASP.NET Core プロジェクトの種類の場合は、プロジェクト ファイルのターゲット フレームワーク モニカー (TFM)net5.0 に更新します。

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

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

</Project>

bin フォルダーと obj フォルダーを削除する

bin および obj フォルダーの削除が必要になる場合があります。 dotnet nuget locals --clear all を実行して、NuGet パッケージ キャッシュを消去します。

5.0.1 およびさらに 5.x リリースから 6.0 まででの、Blazor アプリ ルーティング ロジックの変更

ルートの優先順位の評価が、ASP.NET Core 5.0.1 パッチ リリースで変更されました。 これは、キャッチオール ルートまたはオプション パラメーターのあるルートを定義した場合に、影響を与える可能性があります。

以前の動作

ASP.NET Core 5.0.0 以前の動作では、{*slug} などの優先順位の低いルートが、/customer/{id} などの優先順位の高いルートより前に照合されます。

新しい動作

ASP.NET Core 5.0.1 以降の新しい動作では、ASP.NET Core アプリで定義されているルーティング動作とより厳密に一致するようになり、最初にフレームワークによって各セグメントのルートの優先順位が計算されて確立され、ルートの長さのみが同じ優先順位のときの 2 次基準として使用されます。

変更理由

Blazor のルーティングによってサポートされる機能のサブセットに対して、Blazor のルーティング システムを ASP.NET Core のルーティング システムと同じように動作させることが目的なので、元の動作は実装でのバグと見なされます。

App.razor ファイルの Router コンポーネントに PreferExactMatches 属性を追加して、正しい動作を選択します。

<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 で、スタイルの <head> 要素に <link> 要素を追加します。 次の <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) では、class 属性が page に設定された <div> 要素で、コンポーネントの HTML マークアップを囲みます。

    <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;
    }
    

    Note

    前の例では、Blazor プロジェクト テンプレートで提供される Open Iconic アイコン (open-iconic-bootstrap.css) の @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">
    

    Note

    この更新プログラムは、スタンドアロンの 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 コンポーネントを読み込む要素を、idapp に設定された <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) で:

    • 必要に応じて、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 portal に登録されているスタンドアロン Blazor WebAssembly アプリで、Microsoft アカウントに Microsoft Entra ID (ME-ID) を使用するには:

  • アプリには、openid および offline_access スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳しくは、「Microsoft アカウントを使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」をご覧ください。

Microsoft Entra ID (ME-ID) を使用したスタンドアロン Blazor WebAssembly アプリ

前の「Blazor WebAssembly および Blazor Server プロジェクトを更新する」と「Blazor WebAssembly プロジェクトの更新」セクションのガイダンスに従います。

Azure portal に登録されているスタンドアロン Blazor WebAssembly アプリで Microsoft Entra ID (ME-ID) を使用するには:

  • アプリには、https://graph.microsoft.com/User.Read スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳しくは、「Microsoft Entra ID を使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」をご覧ください。

Azure Active Directory (AAD) B2C を使用するスタンドアロンの Blazor WebAssembly アプリ

前の「Blazor WebAssembly および Blazor Server プロジェクトを更新する」と「Blazor WebAssembly プロジェクトの更新」セクションのガイダンスに従います。

Azure portal に登録されているスタンドアロン Blazor WebAssembly アプリで、Azure Active Directory (AAD) B2C を使用するには:

  • アプリには、openid および offline_access スコープが必要です。

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Azure portal のアプリ登録の [認証] ブレードで:

    1. Web プラットフォームの構成を削除します。
    2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
    3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳しくは、「Azure Active Directory B2C を使用して、ASP.NET Core Blazor WebAssembly スタンドアロン アプリをセキュリティで保護する」をご覧ください。

Microsoft Entra ID (ME-ID) または AAD B2C を使用してホストされている Blazor WebAssembly アプリ

前の「Blazor WebAssembly および Blazor Server プロジェクトを更新する」と「Blazor WebAssembly プロジェクトの更新」セクションのガイダンスに従います。

ユーザー認証に AAD または AAD B2C を使用するホストされた Blazor ソリューションの Client アプリ登録では、シングルページ アプリケーションの Azure Apps プラットフォーム構成を使用する必要があります。

Azure portal の Client アプリ登録の [認証] ブレードで:

  1. Web プラットフォームの構成を削除します。
  2. アプリのリダイレクト URI を使用して、シングルページ アプリケーション プラットフォームの構成を追加します。
  3. [アクセス トークン][ID トークン][暗黙的な許可] を無効にします。

詳細については、以下を参照してください:

ホストされた Blazor ソリューションの Server プロジェクトを更新する

これまでのセクションのガイダンスに従います。

この記事の一般的なガイダンスに従って、ASP.NET Core アプリとしてホストされた Blazor ソリューションの Server プロジェクトを更新します。

さらに、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} プレースホルダーのパッケージ バージョンを確認します。

Note

ホストされた 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 でサインインした後に、アプリへのログイン コールバックで次のエラーを受け取る場合があります。

情報:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 承認に失敗しました。 次の要件が満たされていません。DenyAnonymousAuthorizationRequirement:認証済みユーザーが必要です。

AAD からのログイン コールバック エラー:

  • エラー: unauthorized_client
  • 説明: AADB2C90058: The provided application is not configured to allow public clients.

このエラーを解決するには:

  1. Azure portal で、アプリのマニフェストにアクセスします。
  2. allowPublicClient 属性を null または true に設定します。

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) を更新する

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

コンポーネントを対象とする 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.ConfigureServicesDateTimeModelBinderProvider を削除します。

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 は古くなり、次のコードに示すように、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 パッケージに影響するパッケージ参照の変更

dotnet/runtime に対する dotnet/拡張機能コンテンツの移行と dotnet/aspnetcore (aspnet/Announcements #411) に説明があるように、dotnet/extensions リポジトリから dotnet/runtime に一部の Microsoft.Extensions.* NuGet パッケージを移行するとき、移行されたパッケージの一部にパッケージングの変更が適用されます。 これらの変更により、多くの場合、.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 も含まれます。