Bagikan melalui


Migrasi dari ASP.NET Core di .NET 5 ke .NET 6

Artikel ini menjelaskan cara memperbarui ASP.NET Core yang ada di proyek .NET 5 ke .NET 6. Untuk instruksi tentang cara bermigrasi dari ASP.NET Core 3.1 ke .NET 6, lihat Migrasi dari ASP.NET Core 3.1 ke .NET 6.

Prasyarat

Memperbarui versi .NET SDK di global.json

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

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

Perbarui kerangka target

Perbarui Moniker Kerangka Kerja Target (TFM) pada file proyek menjadi net6.0:

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

  <PropertyGroup>
-    <TargetFramework>net5.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

</Project>

Memperbarui referensi paket

Dalam file proyek, update atribut Microsoft.AspNetCore.* dari referensi paket Microsoft.Extensions.* dan Version ke versi 6.0.0 atau yang lebih baru. Contohnya:

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.3" />
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
</ItemGroup>

Model hosting baru

Model hosting minimal .NET 6 baru untuk aplikasi ASP.NET Core hanya memerlukan satu file dan beberapa baris kode. Aplikasi yang bermigrasi ke .NET 6 tidak perlu menggunakan model hosting minimal baru. Untuk informasi selengkapnya, lihat Aplikasi yang bermigrasi ke .NET 6 tidak perlu menggunakan model hosting minimal baru di bagian berikut.

Kode berikut dari templat kosong ASP.NET Core membuat aplikasi menggunakan model hosting minimal baru:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

Model hosting yang minimal:

  • Secara signifikan mengurangi jumlah file dan baris kode yang diperlukan untuk membuat aplikasi. Hanya satu file yang diperlukan dengan empat baris kode.
  • Menyatukan Startup.cs dan Program.cs ke dalam satu Program.cs file.
  • Menggunakan pernyataan tingkat atas untuk meminimalkan kode yang diperlukan untuk aplikasi.
  • Menggunakan arahan global using untuk menghilangkan atau meminimalkan jumlah using baris pernyataan yang diperlukan.

Kode berikut menampilkan file Startup.cs dan Program.cs dari template Aplikasi Web .NET 5 (Razor Halaman) dengan pernyataan using yang tidak digunakan dihapus.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
// Unused usings removed.

namespace WebAppRPv5
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }
}
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
// Unused usings removed.

namespace WebAppRPv5
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Dalam ASP.NET Core di .NET 6, kode sebelumnya digantikan dengan yang berikut:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Contoh ASP.NET Core sebelumnya dalam .NET 6 menunjukkan cara:

Contoh terperinci migrasi ASP.NET Core dalam kode .NET 5 Startup ke .NET 6 menggunakan model hosting minimal disediakan nanti dalam dokumen ini.

Ada beberapa perubahan pada file lain yang dihasilkan untuk templat Aplikasi Web:

  • Index.cshtml dan Privacy.cshtml memiliki pernyataan using yang tidak digunakan dihapus.
  • RequestId dinyatakan Error.cshtml sebagai jenis referensi nullable (NRT):
- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
  • Tingkat log standar telah berubah di appsettings.json dan appsettings.Development.json:
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
+ "Microsoft.AspNetCore": "Warning"

Dalam kode templat ASP.NET Core sebelumnya, "Microsoft": "Warning" telah diubah menjadi "Microsoft.AspNetCore": "Warning". Perubahan ini menghasilkan pencatatan semua pesan informasi dari Microsoft namespace kecualiMicrosoft.AspNetCore. Misalnya, Microsoft.EntityFrameworkCore sekarang dicatat di tingkat informasi.

Untuk detail selengkapnya tentang model hosting baru, lihat bagian Tanya jawab umum . Untuk informasi selengkapnya tentang adopsi jenis referensi nullable (NRTs) dan analisis statis null-state kompilator .NET, lihat bagian Jenis referensi nullable (NRTs) dan analisis statis null-state kompilator .NET.

Aplikasi yang bermigrasi ke atau menggunakan 6.0 atau yang lebih baru tidak perlu menggunakan model hosting minimal baru

Menggunakan Startup dan Host Generik yang digunakan oleh templat ASP.NET Core 3.1 dan 5.0 didukung sepenuhnya.

Gunakan Startup dengan model hosting minimal baru

aplikasi ASP.NET Core 3.1 dan 5.0 dapat menggunakan kode mereka Startup dengan model hosting minimal baru. Menggunakan Startup dengan model hosting minimal memiliki keuntungan berikut:

  • Tidak ada pantulan tersembunyi yang digunakan untuk memanggil Startup kelas.
  • Kode asinkron dapat ditulis karena pengembang mengontrol panggilan ke Startup.
  • Kode dapat ditulis yang menggabungkan ConfigureServices dan Configure.

Salah satu batasan kecil dalam menggunakan Startup kode dengan model hosting minimal baru adalah bahwa untuk menyuntikkan dependensi ke dalam Configure, layanan di Program.cs harus diselesaikan secara manual.

Pertimbangkan kode berikut yang dihasilkan oleh templat Halaman ASP.NET Core 3.1 atau 5.0 Razor :

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Kode sebelumnya dimigrasikan ke model hosting minimal baru:

using Microsoft.AspNetCore.Builder;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.Run();
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Dalam kode sebelumnya, if (env.IsDevelopment()) blok dihapus karena dalam mode pengembangan, middleware pengembang untuk halaman pengecualian sudah diaktifkan secara default. Untuk informasi selengkapnya, lihat Perbedaan antara model hosting ASP.NET Core di .NET 5 dan .NET 6 di bagian berikutnya.

Saat menggunakan kontainer injeksi dependensi kustom (DI), tambahkan kode yang disorot berikut:

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

// Using a custom DI container.
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(startup.ConfigureContainer);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.Run();
using Autofac;
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    //  Using a custom DI container
    public void ConfigureContainer(ContainerBuilder builder)
    {
        // Configure custom container.
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Saat menggunakan model hosting minimal, middleware perutean titik akhir membungkus seluruh alur middleware, oleh karena itu tidak perlu memiliki panggilan eksplisit ke UseRouting atau UseEndpoints untuk mendaftarkan rute. UseRouting masih dapat digunakan untuk menentukan di mana pencocokan rute terjadi, tetapi UseRouting tidak perlu dipanggil secara eksplisit jika rute harus dicocokkan di awal alur middleware.

Dalam kode berikut, panggilan ke UseRouting dan UseEndpoints dihapus dari Startup. MapRazorPages dipanggil dalam Program.cs:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (!env.IsDevelopment())
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        //app.UseRouting();

        //app.UseEndpoints(endpoints =>
        //{
        //    endpoints.MapRazorPages();
        //});
    }
}
using Microsoft.AspNetCore.Builder;

var builder = WebApplication.CreateBuilder(args);

var startup = new Startup(builder.Configuration);

startup.ConfigureServices(builder.Services);

var app = builder.Build();

startup.Configure(app, app.Environment);

app.MapRazorPages();

app.Run();

Saat menggunakan Startup dengan model hosting minimal baru, ingatlah perbedaan berikut:

  • Program.cs mengontrol instansiasi dan siklus hidup dari kelas Startup.
  • Setiap layanan tambahan yang disuntikkan ke dalam metode Configure perlu diselesaikan secara manual oleh kelas Program.

Perbedaan antara model hosting ASP.NET Core dalam .NET 5 dan .NET 6

  • Dalam mode pengembangan, middleware untuk halaman pengecualian pengembang diaktifkan secara default.
  • Nama aplikasi secara default adalah nama rakitan titik masuk: Assembly.GetEntryAssembly().GetName().FullName. Saat menggunakan WebApplicationBuilder di pustaka, ubahlah nama aplikasi secara eksplisit ke sekumpulan kumpulan perpustakaan agar penemuan bagian aplikasi MVC dapat berfungsi. Lihat Mengubah akar konten, nama aplikasi, dan lingkungan dalam dokumen ini untuk instruksi terperinci.
  • Middleware perutean titik akhir membungkus seluruh alur middleware, oleh karena itu tidak perlu memiliki panggilan eksplisit ke UseRouting atau UseEndpoints untuk mendaftarkan rute. UseRouting masih dapat digunakan untuk menentukan di mana pencocokan rute terjadi, tetapi UseRouting tidak perlu dipanggil secara eksplisit jika rute harus dicocokkan di awal alur middleware.
  • Pipeline dibuat sebelum eksekusi apapunIStartupFilter, oleh karena itu pengecualian yang disebabkan saat membangun pipeline tidak terlihat oleh IStartupFilter rantai panggilan.
  • Beberapa alat, seperti migrasi EF, menggunakan Program.CreateHostBuilder untuk mengakses aplikasi IServiceProvider guna menjalankan logika kustom dalam konteks aplikasi. Alat-alat ini telah diperbarui untuk menggunakan teknik baru untuk menjalankan logika kustom dalam konteks aplikasi. Migrasi Kerangka Kerja Entitas adalah contoh alat yang menggunakan Program.CreateHostBuilder dengan cara ini. Kami berupaya memastikan alat diperbarui untuk menggunakan model baru.
  • Tidak seperti kelas Startup, host minimal tidak secara otomatis mengonfigurasi ruang lingkup DI saat menginstansiasi penyedia layanan. Untuk konteks di mana cakupan diperlukan, perlu dipanggil IServiceScope dengan IServiceScopeFactory.CreateScope untuk membuat instans cakupan baru. Untuk informasi selengkapnya, lihat cara mengatasi layanan saat pengaktifan aplikasi.
  • Tidak dimungkinkan untuk mengubah pengaturan host apa pun seperti nama aplikasi, lingkungan, atau akar konten setelah pembuatan . Untuk instruksi terperinci tentang mengubah pengaturan host, lihat Menyesuaikan IHostBuilder atau IWebHostBuilder. API yang disorot berikut melemparkan pengecualian:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

// WebHost

try
{
    builder.WebHost.UseContentRoot(Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseEnvironment(Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.ApplicationKey, "ApplicationName2");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.ContentRootKey, Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    builder.WebHost.UseSetting(WebHostDefaults.EnvironmentKey, Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

// Host
try
{
    builder.Host.UseEnvironment(Environments.Staging);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

try
{
    // TODO: This does not throw
    builder.Host.UseContentRoot(Directory.GetCurrentDirectory());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();
  • Kelas Startup tidak dapat digunakan dari WebApplicationBuilder.Host atau WebApplicationBuilder.WebHost. Kode yang disorot berikut melemparkan pengecualian:

    var builder = WebApplication.CreateBuilder(args);
    
    try
    {
        builder.Host.ConfigureWebHostDefaults(webHostBuilder =>
        {
            webHostBuilder.UseStartup<Startup>();
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;    
    }
    
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    var builder = WebApplication.CreateBuilder(args);
    
    try
    {
        builder.WebHost.UseStartup<Startup>();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw;    
    }
    
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
  • Implementasi IHostBuilder pada WebApplicationBuilder (WebApplicationBuilder.Host), tidak menunda eksekusi ConfigureServicesmetode , ConfigureAppConfiguration, atau ConfigureHostConfiguration . Tidak menunda eksekusi memungkinkan kode menggunakan WebApplicationBuilder untuk mengamati perubahan yang dilakukan pada IServiceCollection dan IConfiguration. Contoh berikut hanya menambahkan Service1 sebagai IService:

    using Microsoft.Extensions.DependencyInjection.Extensions;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Host.ConfigureServices(services =>
    {
        services.TryAddSingleton<IService, Service1>();
    });
    
    builder.Services.TryAddSingleton<IService, Service2>();
    
    var app = builder.Build();
    
    // Displays Service1 only.
    Console.WriteLine(app.Services.GetRequiredService<IService>());
    
    app.Run();
    
    class Service1 : IService
    {
    }
    
    class Service2 : IService
    {
    }
    
    interface IService
    {
    }
    

Dalam kode sebelumnya, builder.Host.ConfigureServices dipanggil secara sebaris, bukan ditangguhkan sampai builder.Build dipanggil. Ini berarti bahwa Service1 ditambahkan ke IServiceCollection sebelum Service2 dan menghasilkan Service1 yang diselesaikan untuk IService.

Membangun pustaka untuk ASP.NET Core di .NET 6

Ekosistem .NET yang ada dibangun ekstensibilitas di sekitar IServiceCollection, , IHostBuilderdan IWebHostBuilder. Properti ini tersedia di WebApplicationBuilder sebagai Services, Host, dan WebHost.

WebApplication mengimplementasikan baik Microsoft.AspNetCore.Builder.IApplicationBuilder maupun Microsoft.AspNetCore.Routing.IEndpointRouteBuilder.

Kami mengharapkan penulis pustaka agar tetap menarget IHostBuilder, IWebHostBuilder, IApplicationBuilder, dan IEndpointRouteBuilder saat membangun komponen spesifik ASP.NET Core. Ini memastikan bahwa middleware, handler rute, atau titik ekstensibilitas lainnya terus berfungsi di berbagai model hosting.

Tanya jawab umum (FAQ)

  • Apakah model hosting minimal baru kurang mampu?

    Tidak. Model hosting baru secara fungsional setara untuk 98% skenario yang didukung oleh IHostBuilder dan IWebHostBuilder. Ada beberapa skenario lanjutan yang memerlukan solusi khusus pada IHostBuilder, tetapi kami mengharapkan skenario tersebut sangat jarang terjadi.

  • Apakah model hosting generik tidak digunakan lagi?

    Tidak. Model hosting generik adalah model alternatif yang didukung tanpa batas waktu. Host generik mendukung model hosting baru dan masih merupakan cara utama untuk menghosting aplikasi berbasis pekerja.

  • Apakah saya harus bermigrasi ke model hosting baru?

    Tidak. Model hosting baru adalah cara yang disukai untuk menghosting aplikasi baru menggunakan .NET 6 atau yang lebih baru, tetapi Anda tidak dipaksa untuk mengubah tata letak proyek di aplikasi yang ada. Ini berarti aplikasi dapat meningkatkan dari .NET 5 ke .NET 6 dengan mengubah kerangka kerja target dalam file proyek dari net5.0 ke net6.0. Untuk informasi selengkapnya, lihat bagian Memperbarui kerangka kerja target di artikel ini. Namun, sebaiknya aplikasi bermigrasi ke model hosting baru untuk memanfaatkan fitur baru yang hanya tersedia untuk model hosting baru.

  • Apakah saya harus menggunakan pernyataan tingkat atas?

    Tidak. Semua templat proyek baru menggunakan pernyataan tingkat atas, tetapi API hosting baru dapat digunakan di aplikasi .NET 6 apa pun untuk menghosting server web atau aplikasi web.

  • Di mana saya menempatkan state yang disimpan sebagai field di Program atau Startup kelas saya?

    Kami sangat menyarankan penggunaan injeksi dependensi (DI) untuk mengelola status di aplikasi ASP.NET Core.

    Ada dua pendekatan untuk menyimpan status di luar DI:

    • Simpan status di kelas lain. Menyimpan di kelas mengasumsikan status statis yang dapat diakses dari mana saja di aplikasi.

    • Gunakan kelas yang Program dihasilkan oleh pernyataan tingkat atas untuk menyimpan status. Menggunakan Program untuk menyimpan status adalah pendekatan semantik:

      var builder = WebApplication.CreateBuilder(args);
      
      ConfigurationValue = builder.Configuration["SomeKey"] ?? "Hello";
      
      var app = builder.Build();
      
      app.MapGet("/", () => ConfigurationValue);
      
      app.Run();
      
      partial class Program
      {
          public static string? ConfigurationValue { get; private set; }
      }
      
  • Bagaimana jika saya menggunakan kontainer injeksi dependensi kustom?

    Kontainer DI yang kustom didukung. Misalnya, lihat Kontainer injeksi dependensi kustom (DI).

  • Apakah WebApplicationFactory dan TestServer masih bekerja?

    Ya. WebApplicationFactory<TEntryPoint> adalah cara untuk menguji model hosting baru. Misalnya, lihat Menguji dengan WebApplicationFactory atau TestServer.

Blazor

Setelah mengikuti panduan sebelumnya dalam artikel ini untuk memperbarui aplikasi ke .NET 6, adopsi fitur tertentu dengan mengikuti tautan di Apa yang baru di ASP.NET Core di .NET 6.

Untuk mengadopsi semua fitur 6.0 baru untuk Blazor aplikasi, kami merekomendasikan proses berikut:

  • Buat proyek 6.0 Blazor baru dari salah satu template proyek. Untuk informasi selengkapnya, lihat Alat untuk ASP.NET Core Blazor.
  • Pindahkan komponen dan kode aplikasi ke aplikasi 6.0 yang membuat modifikasi untuk mengadopsi fitur .NET 6 baru.

Memigrasikan proyek SPA

Memigrasikan aplikasi Angular dari ekstensi SPA

Lihat masalah GitHub ini

Memigrasikan aplikasi React dari ekstensi SPA

Lihat Memigrasikan aplikasi React dari Ekstensi Spa dalam masalah GitHub ini

Memperbarui gambar Docker

Untuk aplikasi yang menggunakan Docker, perbarui pernyataan dan skrip Dockerfile. Gunakan gambar dasar yang menyertakan ASP.NET Core dalam runtime .NET 6. Pertimbangkan perbedaan perintah berikut docker pull antara ASP.NET Core di .NET 5 dan .NET 6:

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

Lihat Isu GitHub Perubahan yang Mengganggu: Format pencatat konsol default diatur ke JSON.

Perubahan pada ASP.NET Core Razor SDK

Pengkompilasi Razor sekarang memanfaatkan fitur generator sumber baru untuk menghasilkan file C# yang dikompilasi dari Razor tampilan dan halaman dalam proyek. Di versi sebelumnya:

  • Kompilasi bergantung pada target RazorGenerate dan RazorCompile untuk menghasilkan kode hasil. Target ini tidak lagi valid. Di .NET 6, pembuatan kode dan kompilasi didukung oleh satu panggilan ke pengkompilasi. RazorComponentGenerateDependsOn masih didukung untuk menentukan dependensi yang diperlukan sebelum build berjalan.
  • Rakitan terpisah Razor , AppName.Views.dll, dihasilkan yang berisi jenis tampilan yang dikompilasi dalam aplikasi. Perilaku ini telah tidak digunakan lagi dan satu rakitan AppName.dll diproduksi yang berisi jenis aplikasi dan tampilan yang dihasilkan.
  • Jenis aplikasi di AppName.Views.dll adalah publik. Di .NET 6, jenis aplikasi berada di AppName.dll tetapi adalah internal sealed. Aplikasi yang melakukan penemuan jenis pada AppName.Views.dll tidak akan dapat melakukan penemuan jenis pada AppName.dll. Berikut ini menunjukkan perubahan API:
- public class Views_Home_Index : global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<dynamic>
+ internal sealed class Views_Home_Index : global::Microsoft.AspNetCore.Mvc.Razor.RazorPage<dynamic>

Buat perubahan berikut:

  • Properti berikut ini tidak lagi berlaku dengan model kompilasi langkah tunggal.
    • RazorTargetAssemblyAttribute
    • RazorTargetName
    • EnableDefaultRazorTargetAssemblyInfoAttributes
    • UseRazorBuildServer
    • GenerateRazorTargetAssemblyInfo
    • GenerateMvcApplicationPartsAssemblyAttributes

Untuk informasi selengkapnya, lihat Razor pengompilator tidak lagi menghasilkan assembly Views.

Templat proyek menggunakan Duende Identity Server

Templat proyek sekarang menggunakan Duende Identity Server.

Penting

Duende Identity Server adalah produk sumber terbuka dengan perjanjian lisensi timbal balik. Jika Anda berencana untuk menggunakan Duende Identity Server dalam produksi, Anda mungkin diharuskan untuk mendapatkan lisensi komersial dari Duende Software dan membayar biaya lisensi. Untuk informasi selengkapnya, lihat Perangkat Lunak Duende: Lisensi.

Untuk mempelajari cara menggunakan Microsoft Azure Active Directory untuk ASP.NET Core Identity, lihat Identity (repositori GitHub dotnet/aspnetcore).

DbSet<Key> Tambahkan properti bernama Keys ke setiap IdentityDbContext untuk memenuhi persyaratan baru dari versi yang diperbarui.IPersistedGrantDbContext Kunci diperlukan sebagai bagian dari kontrak dengan toko-toko dari Duende Identity Server.

public DbSet<Key> Keys { get; set; }

Nota

Migrasi yang ada harus dibuat ulang untuk Duende Identity Server.

Sampel kode dimigrasikan ke ASP.NET Core di .NET 6

Sampel kode dimigrasikan ke model hosting minimal baru di 6.0

Tinjau perubahan yang signifikan

Lihat sumber daya berikut:

Jenis referensi dapat bernilai nol (NRTs) dan analisis statis keadaan-nol oleh .NET compiler

Template proyek ASP.NET Core menggunakan jenis referensi nullable (NRTs), dan kompilator .NET melakukan analisis statis keadaan null. Fitur-fitur ini dirilis dengan C# 8 dan diaktifkan secara default untuk aplikasi yang dihasilkan menggunakan ASP.NET Core di .NET 6 (C# 10) atau yang lebih baru.

Peringatan analisis statis null-state dari kompiler .NET dapat digunakan sebagai panduan untuk memperbarui contoh dokumentasi atau aplikasi secara lokal atau diabaikan. Analisis status null secara statis dapat dinonaktifkan dengan cara mengubah Nullable ke disable di dalam file proyek aplikasi, yang kami hanya rekomendasikan untuk contoh dokumentasi dan contoh aplikasi jika peringatan kompilator mengganggu saat mempelajari tentang .NET. Kami tidak menyarankan untuk menonaktifkan pemeriksaan status null dalam proyek produksi.

Untuk informasi selengkapnya mengenai NRTs, properti MSBuild Nullable, dan pembaruan aplikasi (termasuk panduan #pragma), lihat sumber daya berikut di dalam dokumentasi C#:

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

Di .NET 6, WebApplicationBuilder menormalkan jalur akar konten ke akhir dengan DirectorySeparatorChar. Sebagian besar aplikasi yang bermigrasi dari HostBuilder atau WebHostBuilder tidak akan memiliki nama aplikasi yang sama karena tidak dinormalisasi. Untuk informasi selengkapnya, lihat SetApplicationName

Sumber daya tambahan