Migrasi dari ASP.NET Core 3.1 ke 5.0

Artikel ini menjelaskan cara memperbarui proyek ASP.NET Core 3.1 yang ada ke ASP.NET Core 5.0. Untuk petunjuk tentang cara bermigrasi dari ASP.NET Core 3.1 ke ASP.NET Core 6.0, lihat Migrasi dari ASP.NET Core 3.1 ke 6.0.

Prasyarat

Memperbarui versi .NET Core SDK di global.json

Jika Anda mengandalkan global.json file untuk menargetkan versi .NET Core SDK tertentu, perbarui version properti ke versi .NET 5.0 SDK yang diinstal. Contohnya:

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

Memperbarui kerangka kerja target

Jika memperbarui Blazor WebAssembly proyek, lewati ke bagian Perbarui Blazor WebAssembly proyek . Untuk jenis proyek ASP.NET Core lainnya, perbarui Target Framework Moniker (TFM) file proyek menjadi net5.0:

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

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

</Project>

Hapus bin dan obj folder

Anda mungkin perlu menghapus bin folder dan obj . Jalankan dotnet nuget locals --clear all untuk menghapus cache paket NuGet.

Blazor Perubahan pada logika perutean aplikasi di 5.0.1 dan rilis 5.x lebih lanjut hingga 6.0

Komputasi prioritas rute berubah dalam rilis patch ASP.NET Core 5.0.1. Ini dapat memengaruhi Anda jika Anda telah menentukan rute atau rute catch-all dengan parameter opsional.

Perilaku yang lama

Dengan perilaku sebelumnya di ASP.NET Core 5.0.0 atau yang lebih lama, rute dengan prioritas yang lebih rendah, seperti {*slug}, dicocokkan sebelum rute dengan prioritas yang lebih tinggi, seperti /customer/{id}.

Perilaku yang baru

Perilaku baru di ASP.NET Core 5.0.1 atau yang lebih baru lebih cocok dengan perilaku perutean yang ditentukan dalam aplikasi ASP.NET Core, di mana kerangka kerja menghitung dan menetapkan prioritas rute untuk setiap segmen terlebih dahulu dan hanya menggunakan panjang rute untuk memutuskan ikatan sebagai kriteria sekunder.

Alasan untuk berubah

Perilaku asli dianggap sebagai bug dalam implementasi karena tujuan kami adalah agar Blazor sistem perutean berperilaku dengan cara yang sama seperti sistem perutean ASP.NET Core untuk subset fitur yang didukung oleh Blazor perutean.

PreferExactMatches Tambahkan atribut ke Router komponen dalam App.razor file untuk memilih perilaku yang benar:

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

Ketika PreferExactMatches diatur ke @true, pencocokan rute lebih memilih kecocokan yang tepat daripada kartubebas.

Penting

Semua aplikasi harus secara eksplisit diatur PreferExactMatches ke @true.

Kemampuan untuk mengatur PreferExactMatches@false ke atau membiarkannya tidak diatur hanya disediakan untuk kompatibilitas mundur.

Ketika .NET 6 dirilis, router akan selalu lebih memilih kecocokan yang tepat, dan PreferExactMatches opsi tidak akan tersedia.

Pembaruan Blazor WebAssembly dan Blazor Server proyek

Panduan di bagian ini berlaku untuk kedua Blazor model hosting. Bagian yang mengikuti bagian ini memberikan panduan tambahan khusus untuk menghosting model dan jenis aplikasi. Terapkan panduan dari semua bagian yang relevan ke aplikasi Anda.

  1. Blazor WebAssembly Di wwwroot/index.html aplikasi atau Pages/_Host.cshtmlBlazor Server aplikasi, tambahkan <link> elemen ke <head> elemen untuk gaya. Dalam nilai atribut elemen href berikut<link>, tempat penampung {ASSEMBLY NAME} adalah nama rakitan aplikasi.

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

    Blazor WebAssembly Mandiri atau Blazor Server contoh:

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

    Client proyek contoh solusi yang dihosting Blazor WebAssembly :

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Sertakan namespace baru dalam file aplikasi _Imports.razor untuk virtualisasi komponen, Microsoft.AspNetCore.Components.Web.Virtualization. File berikut _Imports.razor menunjukkan namespace default dalam aplikasi yang dihasilkan dari Blazor templat proyek. Tempat penampung {ASSEMBLY NAME} adalah nama rakitan aplikasi.

    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 Dalam komponen (Shared/MainLayout.razor), kelilingi markup HTML komponen dengan <div> elemen yang memiliki atribut yang class diatur ke page:

    <div class="page">
    
        ...
    
    </div>
    
  4. Tambahkan file berikut ke Shared folder :

    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. File Blazor WebAssembly dasar wwwroot/css/app.css terbaru aplikasi atau wwwroot/css/site.css file Blazor Server aplikasi menyertakan gaya berikut. Hapus gaya tambahan yang meninggalkan gaya berikut dan gaya apa pun yang telah Anda tambahkan ke aplikasi.

    Lembar gaya berikut ini hanya menyertakan gaya dasar dan tidak menyertakan gaya kustom yang ditambahkan oleh pengembang:

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

    Catatan

    Contoh sebelumnya tidak menampilkan direktif @import untuk ikon Ikon Terbuka (open-iconic-bootstrap.css), yang disediakan oleh Blazor templat proyek. Open Iconic ditinggalkan oleh para penjaganya.

Memperbarui proyek Blazor WebAssembly

Ikuti panduan di bagian Pembaruan Blazor WebAssembly dan Blazor Server proyek sebelumnya.

Blazor WebAssembly Untuk proyek, termasuk Client proyek solusi yang dihosting, terapkan Blazor perubahan berikut pada file proyek:

  1. Perbarui SDK dari Microsoft.NET.Sdk.Web ke Microsoft.NET.Sdk.BlazorWebAssembly:

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

    Catatan

    Pembaruan ini hanya berlaku untuk proyek mandiri Blazor WebAssembly dan Client proyek solusi yang dihosting Blazor .

  2. Perbarui properti berikut:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Hapus referensi paket ke Microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Perbarui paket lain ke versi terbarunya. Versi terbaru dapat ditemukan di NuGet.org.

  5. Di wwwroot/index.html, ubah elemen yang memuat App komponen ke <div> elemen dengan set id ke app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Di Program.Main (Program.cs), ubah referensi ke <app> elemen ke pemilih CSS dengan menambahkan hash # ke dalamnya:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Di Program.Main (Program.cs), ubah pendaftaran sementara HttpClient default menjadi terlingkup, jika ada:

    -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. Di Program.Main (Program.cs) aplikasi solusi yang Client dihosting Blazor :

    • Secara opsional, ganti builder.HostEnvironment.BaseAddress alamat dasar klien string.
    • Ubah pendaftaran pabrik klien sementara bernama menjadi cakupan.
    -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"));
    

    Dalam kode sebelumnya, {APP NAMESPACE} tempat penampung adalah namespace aplikasi.

Aplikasi mandiri Blazor WebAssembly dengan Akun Microsoft

Ikuti panduan di bagian Pembaruan Blazor WebAssembly dan proyek dan Blazor ServerPembaruan Blazor WebAssembly proyek sebelumnya.

Untuk aplikasi mandiri Blazor WebAssembly yang terdaftar di portal Azure untuk menggunakan ID Microsoft Entra (ME-ID) untuk Akun Microsoft:

  • Aplikasi ini memerlukan openid cakupan dan offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Di bilah Autentikasi pendaftaran aplikasi portal Azure:

    1. Hapus konfigurasi platform Web.
    2. Tambahkan konfigurasi platform aplikasi Satu halaman dengan URI pengalihan aplikasi.
    3. Nonaktifkan pemberian implisit untuk Token akses dan token ID.

Untuk informasi selengkapnya, lihat Mengamankan aplikasi mandiri ASP.NET Core Blazor WebAssembly dengan Akun Microsoft.

Aplikasi mandiri Blazor WebAssembly dengan MICROSOFT Entra ID (ME-ID)

Ikuti panduan di bagian Pembaruan Blazor WebAssembly dan proyek dan Blazor ServerPembaruan Blazor WebAssembly proyek sebelumnya.

Untuk aplikasi mandiri Blazor WebAssembly yang terdaftar di portal Azure untuk menggunakan ID Microsoft Entra (ME-ID):

  • Aplikasi ini memerlukan https://graph.microsoft.com/User.Read cakupan:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Di bilah Autentikasi pendaftaran aplikasi portal Azure:

    1. Hapus konfigurasi platform Web.
    2. Tambahkan konfigurasi platform aplikasi Satu halaman dengan URI pengalihan aplikasi.
    3. Nonaktifkan pemberian implisit untuk Token akses dan token ID.

Untuk informasi selengkapnya, lihat Mengamankan aplikasi mandiri ASP.NET Core Blazor WebAssembly dengan ID Microsoft Entra.

Aplikasi mandiri Blazor WebAssembly dengan Azure Active Directory (AAD) B2C

Ikuti panduan di bagian Pembaruan Blazor WebAssembly dan proyek dan Blazor ServerPembaruan Blazor WebAssembly proyek sebelumnya.

Untuk aplikasi mandiri Blazor WebAssembly yang terdaftar di portal Azure untuk menggunakan Azure Active Directory (AAD) B2C:

  • Aplikasi ini memerlukan openid cakupan dan offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Di bilah Autentikasi pendaftaran aplikasi portal Azure:

    1. Hapus konfigurasi platform Web.
    2. Tambahkan konfigurasi platform aplikasi Satu halaman dengan URI pengalihan aplikasi.
    3. Nonaktifkan pemberian implisit untuk Token akses dan token ID.

Untuk informasi selengkapnya, lihat Mengamankan aplikasi mandiri ASP.NET Core Blazor WebAssembly dengan Azure Active Directory B2C.

Aplikasi yang dihosting Blazor WebAssembly dengan MICROSOFT Entra ID (ME-ID) atau AAD B2C

Ikuti panduan di bagian Pembaruan Blazor WebAssembly dan proyek dan Blazor ServerPembaruan Blazor WebAssembly proyek sebelumnya.

Pendaftaran Client aplikasi solusi yang dihosting Blazor yang menggunakan AAD atau AAD B2C untuk autentikasi pengguna harus menggunakan konfigurasi platform Azure Apps aplikasi satu halaman.

Di bilah Autentikasi pendaftaran aplikasi portal AzureClient:

  1. Hapus konfigurasi platform Web.
  2. Tambahkan konfigurasi platform aplikasi Satu halaman dengan URI pengalihan aplikasi.
  3. Nonaktifkan pemberian implisit untuk Token akses dan token ID.

Untuk informasi selengkapnya, lihat:

Memperbarui proyek Server dari solusi yang dihosting Blazor

Ikuti panduan di bagian sebelumnya:

Server Perbarui proyek solusi yang dihosting Blazor sebagai aplikasi ASP.NET Core mengikuti panduan umum dalam artikel ini.

Selain itu, Server proyek yang mengautentikasi pengguna ke aplikasi klien Blazor WebAssembly dengan MICROSOFT Entra ID (ME-ID) atau B2C harus mengadopsi paket Microsoft Identity v2.0 baru:

Untuk AAD:

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

Untuk 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}" />

Untuk referensi paket sebelumnya, tentukan versi paket untuk {VERSION} tempat penampung pada NuGet.org:

Catatan

SDK Server proyek dalam solusi yang dihosting Blazor WebAssembly tetap Microsoft.NET.Sdk.Web:

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

Untuk informasi selengkapnya, lihat:

Bersihkan dan bangun kembali solusinya

Setelah memigrasikan aplikasi atau solusi ke .NET 5, bersihkan dan bangun kembali aplikasi atau solusi. Jika ketidakcocokan paket ada antara referensi paket baru dan paket cache:

  1. Hapus cache paket NuGet dengan menjalankan perintah berikut dotnet nuget locals dalam shell perintah:

    dotnet nuget locals --clear all
    
  2. Bersihkan dan bangun kembali aplikasi atau solusi.

Pemecahan Masalah

Ikuti Panduan pemecahan masalah di akhir Blazor WebAssembly topik keamanan yang berlaku untuk aplikasi Anda:

Aplikasi Blazor WebAssembly mandiri:

Aplikasi Blazor WebAssembly yang dihosting:

Klien yang tidak sah untuk ID Microsoft Entra (ME-ID)

Setelah memutakhirkan Blazor WebAssembly aplikasi yang menggunakan AAD untuk autentikasi, Anda mungkin menerima kesalahan berikut pada panggilan balik masuk ke aplikasi setelah pengguna masuk dengan AAD:

info: Otorisasi Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] gagal. Persyaratan ini tidak terpenuhi: DenyAnonymousAuthorizationRequirement: Memerlukan pengguna yang diautentikasi.

Kesalahan panggilan balik masuk dari AAD:

  • Kesalahan: unauthorized_client
  • Deskripsi: AADB2C90058: The provided application is not configured to allow public clients.

Untuk mengatasi masalah ini:

  1. Di portal Azure, akses manifes aplikasi.
  2. Atur atribut ke allowPublicClientnull atau true.

Blazor Memperbarui Aplikasi Web Progresif (PWA)

Tambahkan item berikut ke file proyek aplikasi PWA:

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

Jika proyek wwwroot/index.html (Blazor WebAssembly) atau Pages/_Host.cshtml (Blazor Server) berisi elemen lembar gaya untuk scoped.styles.css dari rilis <link> pratinjau 5.0 sebelumnya, hapus <link> tag:

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

Memperbarui Razor pustaka kelas (RCL)

Migrasikan Razor pustaka kelas (RCL) untuk memanfaatkan API atau fitur baru yang diperkenalkan sebagai bagian dari ASP.NET Core 5.0.

Untuk memperbarui RCL yang menargetkan komponen:

  1. Perbarui properti berikut dalam file proyek:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Perbarui paket lain ke versi terbarunya. Versi terbaru dapat ditemukan di NuGet.org.

Untuk memperbarui MVC penargetan RCL, perbarui properti berikut dalam file proyek:

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

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

Memperbarui referensi paket

Dalam file proyek, perbarui setiap Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*, dan atribut referensi Version paket System.Net.Http.Json ke 5.0.0 atau yang lebih baru. Contohnya:

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

Memperbarui gambar Docker

Untuk aplikasi yang menggunakan Docker, perbarui pernyataan dan skrip DockerfileFROM Anda. Gunakan gambar dasar yang menyertakan runtime ASP.NET Core 5.0. Pertimbangkan perbedaan perintah berikut docker pull antara ASP.NET Core 3.1 dan 5.0:

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

Sebagai bagian dari perpindahan ke ".NET" sebagai nama produk, gambar Docker dipindahkan dari mcr.microsoft.com/dotnet/core repositori ke mcr.microsoft.com/dotnet. Untuk informasi selengkapnya, lihat dotnet/dotnet-docker#1939.

Perubahan pengikatan model di ASP.NET Core MVC dan Razor Pages

Nilai DateTime terikat model sebagai waktu UTC

Dalam ASP.NET Core 3.1 dan yang lebih lama, DateTime nilai terikat model sebagai waktu lokal, di mana zona waktu ditentukan oleh server. DateTime nilai terikat dari pemformatan input (JSON) dan DateTimeOffset nilai terikat sebagai zona waktu UTC.

Di ASP.NET Core 5.0 dan yang lebih baru, pengikatan model secara konsisten mengikat DateTime nilai dengan zona waktu UTC.

Untuk mempertahankan perilaku sebelumnya, hapus DateTimeModelBinderProvider di Startup.ConfigureServices:

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder menggantikan ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Untuk menambahkan dukungan untuk pengikatan model jenis catatan C# 9, adalah ComplexTypeModelBinderProvider :

  • Diannotasi sebagai usang.
  • Tidak lagi terdaftar secara default.

Aplikasi yang mengandalkan keberadaan ComplexTypeModelBinderProvider dalam ModelBinderProviders koleksi perlu mereferensikan penyedia pengikat baru:

- var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexTypeModelBinderProvider>();
+ var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexObjectModelBinderProvider>();

UseDatabaseErrorPage usang

Templat ASP.NET Core 3.1 yang menyertakan opsi untuk akun pengguna individual menghasilkan panggilan ke UseDatabaseErrorPage. UseDatabaseErrorPage sekarang usang dan harus diganti dengan kombinasi AddDatabaseDeveloperPageExceptionFilter dan UseMigrationsEndPoint, seperti yang ditunjukkan dalam kode berikut:

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

Untuk informasi lebih lanjut, lihat masalah GitHub ini.

Modul Inti ASP.NET (ANCM)

Jika ASP.NET Core Module (ANCM) bukan komponen yang dipilih saat Visual Studio diinstal atau jika versi ANCM sebelumnya diinstal pada sistem, unduh Penginstal Bundel Hosting .NET Core terbaru (unduh langsung) dan jalankan alat penginstal. Untuk informasi selengkapnya, lihat Bundel Hosting.

Perubahan referensi paket memengaruhi beberapa paket NuGet

Dengan migrasi beberapa Microsoft.Extensions.* paket NuGet dari repositori dotnet/extensions ke dotnet/runtime, seperti yang dijelaskan dalam Memigrasikan konten dotnet/extensions ke dotnet/runtime dan dotnet/aspnetcore (aspnet/Announcements #411), perubahan pengemasan diterapkan ke beberapa paket yang dimigrasikan. Perubahan ini sering mengakibatkan perubahan namespace untuk .NET API.

Untuk meneliti API lebih lanjut untuk perubahan namespace aplikasi saat bermigrasi ke 5.0, gunakan browser .NET API.

Memigrasikan Microsoft.Identity. Web

Halaman wiki berikut menjelaskan cara memigrasikan Microsoft.Identity. Web dari ASP.NET Core 3.1 hingga 5.0:

Tutorial berikut juga menjelaskan migrasi:

Tinjau perubahan yang melanggar

Untuk memutus perubahan dari .NET Core 3.1 ke .NET 5.0, lihat Melanggar perubahan untuk migrasi dari versi 3.1 ke 5.0. ASP.NET Core dan Entity Framework Core juga disertakan dalam daftar.