Migrasi dari ASP.NET Core 5.0 ke 6.0

Artikel ini menjelaskan cara memperbarui proyek ASP.NET Core 5.0 yang ada ke ASP.NET Core 6.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 SDK di global.json

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

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

Memperbarui kerangka kerja target

Perbarui Moniker Kerangka Kerja Target (TFM) 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, perbarui atribut referensi Version masing-masing Microsoft.AspNetCore.* dan Microsoft.Extensions.* paket ke 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 6.0 tidak perlu menggunakan model hosting minimal baru. Untuk informasi selengkapnya, lihat Aplikasi yang bermigrasi ke 6.0 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 minimal:

  • Secara signifikan mengurangi jumlah file dan baris kode yang diperlukan untuk membuat aplikasi. Hanya satu file yang diperlukan dengan empat baris kode.
  • Menyaingkan 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 Startup.cs file dan Program.cs dari templat ASP.NET Core 5 Web App (Razor Pages) dengan pernyataan yang tidak using 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>();
                });
    }
}

Di ASP.NET Core 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();

Sampel ASP.NET Core 6 sebelumnya menunjukkan caranya:

Contoh terperinci migrasi kode ASP.NET Core 5 Startup ke ASP.NET Core 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 yang tidak digunakan using dihapus.
  • RequestId dinyatakan Error.cshtml sebagai jenis referensi nullable (NRT):
- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
  • Default tingkat log 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 pengelogan semua pesan informasi dari Microsoft namespace layanan 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 NRTs dan analisis null-state kompilator .NET, lihat bagian Analisis statis null-state jenis referensi nullable (NRTs) dan .NET.

Aplikasi yang bermigrasi ke atau menggunakan 6.0 dan 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

ASP.NET aplikasi 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 bahwa interleave 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 halaman pengecualian pengembang diaktifkan secara default. Untuk informasi selengkapnya, lihat Perbedaan antara model hosting ASP.NET Core 5 dan 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 masa Startup pakai kelas.
  • Setiap layanan tambahan yang disuntikkan ke Configure dalam metode perlu diselesaikan secara manual oleh Program kelas.

Perbedaan antara model hosting ASP.NET Core 5 dan 6

  • Dalam mode pengembangan, middleware halaman pengecualian pengembang diaktifkan secara default.
  • Nama aplikasi default ke nama perakitan titik entri: Assembly.GetEntryAssembly().GetName().FullName. Saat menggunakan WebApplicationBuilder di pustaka, ubah nama aplikasi secara eksplisit ke perakitan pustaka untuk memungkinkan penemuan bagian aplikasi MVC 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.
  • Alur dibuat sebelum eksekusi apa punIStartupFilter, oleh karena itu pengecualian yang disebabkan saat membangun alur tidak terlihat oleh IStartupFilter rantai panggilan.
  • Beberapa alat, seperti migrasi EF, digunakan Program.CreateHostBuilder untuk mengakses aplikasi IServiceProvider untuk 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.
  • Startup Tidak seperti kelas , host minimal tidak secara otomatis mengonfigurasi cakupan DI saat membuat instans 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 .WebApplicationBuilder 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 panggilan balik dipanggil sebaris daripada ditangguhkan sampai builder.Build dipanggil. Ini berarti bahwa Service1 ditambahkan ke IServiceCollection sebelumnya Service2 dan menghasilkan Service1 diselesaikan untuk IService.

Membangun pustaka untuk ASP.NET Core 6

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

WebApplication mengimplementasikan dan Microsoft.AspNetCore.Builder.IApplicationBuilderMicrosoft.AspNetCore.Routing.IEndpointRouteBuilder.

Kami mengharapkan penulis pustaka untuk terus menargetkan IHostBuilder, , IWebHostBuilderIApplicationBuilder, 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.

Pertanyaan 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 dan 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 status yang disimpan sebagai bidang di kelas atau Startup sayaProgram?

    Kami sangat menyarankan penggunaan injeksi dependensi (DI) untuk mengalirkan 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 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 6.0, adopsi fitur tertentu dengan mengikuti tautan di Apa yang baru di ASP.NET Core 6.0.

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

  • Buat proyek 6.0 Blazor baru dari salah Blazor satu templat 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 6.0 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 DockerfileFROM Anda. Gunakan gambar dasar yang menyertakan runtime ASP.NET Core 6.0. Pertimbangkan perbedaan perintah berikut docker pull antara ASP.NET Core 5.0 dan 6.0:

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

Lihat Masalah GitHub Melanggar Perubahan: Format pencatat konsol default diatur ke JSAKTIF.

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 RazorGenerate target dan RazorCompile untuk menghasilkan kode yang dihasilkan. 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 AppName.Views.dll jenis pada tidak akan dapat melakukan penemuan jenis di 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>

Lakukan perubahan berikut:

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

Untuk informasi selengkapnya, lihat Razor pengkompilasi tidak lagi menghasilkan rakitan Tampilan.

Templat proyek menggunakan Duende Identity Server

Templat proyek sekarang menggunakan Duende Identity Server. Untuk panduan migrasi, lihat IdentityServer4 v4.1 ke Duende IdentityServer v5.

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 penyimpanan Duende Identity Server.

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

Catatan

Migrasi yang ada harus dibuat ulang untuk Duende Identity Server.

Sampel kode dimigrasikan ke ASP.NET Core 6.0

Sampel kode dimigrasikan ke model hosting minimal baru di 6.0

Tinjau perubahan yang melanggar

Lihat sumber daya berikut:

Jenis referensi nullable (NRTs) dan .NET compiler null-state static analysis

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

Peringatan analisis statis status null pengompilasi .NET dapat berfungsi sebagai panduan untuk memperbarui contoh dokumentasi atau contoh aplikasi secara lokal atau diabaikan. Analisis statis status null dapat dinonaktifkan dengan mengatur Nullable ke disable dalam file proyek aplikasi, yang hanya kami 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 tentang NRTs, properti MSBuild Nullable , dan memperbarui aplikasi (termasuk #pragma panduan), lihat sumber daya berikut 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: