共用方式為


從 .NET 5 中的 ASP.NET Core 遷移至 .NET 6

本文說明如何將 .NET 5 專案中現有的 ASP.NET Core 更新為 .NET 6。 如需如何從 ASP.NET Core 3.1 移轉至 .NET 6 的指示,請參閱 從 ASP.NET Core 3.1 移轉至 .NET 6

先決條件

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

如果您依賴 global.json 檔案來指定一個特定的 .NET SDK 版本,請將 version 屬性更新為您所安裝的 .NET 6 SDK 版本。 例如:

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

更新目標 Framework

將專案檔案中的 目標框架識別符(TFM) 更新為 net6.0

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

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

</Project>

更新套件參考

在項目檔中,將每個 Microsoft.AspNetCore.*Microsoft.Extensions.* 套件參考的 Version 屬性更新為 6.0.0 或更新版本。 例如:

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

新的主機模型

適用於 ASP.NET Core 應用程式的新 .NET 6 最小裝載模型只需要一個檔案和幾行程式代碼。 移轉至 .NET 6 的應用程式不需要使用新的最小裝載模型。 如需詳細資訊,請參閱下一節中 轉至 .NET 6 的應用程式無需使用新的最小裝載模式

ASP.NET Core 空白樣本中的下列程式代碼會使用新的最小裝載模型來建立應用程式:

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

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

app.Run();

最小主機托管模型

  • 大幅減少建立應用程式所需的檔案和程式碼數目。 只需要一個檔案和四行程式碼。
  • Startup.csProgram.cs 整合成單一 Program.cs 檔案。
  • 使用最上層陳述式,將應用程式所需的程式碼降至最低。
  • 使用全域 using 指示詞,消除所需的 using 陳述式行數或將其降至最低。

下列程式碼會顯示 .NET 5 網頁應用程式範本(Razor Pages)中的 Startup.csProgram.cs 檔案,並移除未使用的 using 語句:

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

在 .NET 6 的 ASP.NET Core 中,上述程式代碼會由下列程式代碼取代:

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

.NET 6 中的上述 ASP.NET Core 範例示範如何:

本檔稍後會提供使用最小裝載模型將 .NET 5 Startup 程式代碼中的 ASP.NET Core 移轉至 .NET 6 的詳細範例。

Web 應用程式範本所產生的其他檔案有一些變更:

- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
  • appsettings.jsonappsettings.Development.json 中的 log 層級預設值已變更:
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
+ "Microsoft.AspNetCore": "Warning"

在上述 ASP.NET Core 樣本程式代碼中, "Microsoft": "Warning" 已變更為 "Microsoft.AspNetCore": "Warning"。 這項變更會導致從 命名空間記錄所有參考訊息Microsoft,但除外Microsoft.AspNetCore。 例如,Microsoft.EntityFrameworkCore 現在會記錄在資訊層級。

如需新裝載模型的詳細資訊,請參閱 常見問題 一節。 如需了解採用 NRT 和 .NET 編譯器 Null 狀態分析的更多資訊,請參閱 可為 Null 的參考類型(NRT)和 .NET 編譯器 Null 狀態靜態分析 一節。

移轉至或使用 6.0 或更新版本的應用程式不需要使用新的最小裝載模型

完全支援 ASP.NET Core 3.1 和 5.0 範本所使用的 Using StartupGeneric Host

使用新的最低限度託管模型啟動程序

ASP.NET Core 3.1 和 5.0 應用程式可以使用其 Startup 程式代碼搭配新的最小裝載模型。 使用最小託管模型的 Startup 具有下列優點:

  • 不會使用隱藏的反映來呼叫 Startup 類別。
  • 因為開發人員控制對 Startup的呼叫,因此可以撰寫異步程序代碼。
  • 可以撰寫可交錯 ConfigureServicesConfigure 的程式碼。

在使用新的最小裝載模型搭配 Startup 程式碼時,一個次要限制是:要將相依性注入到 Configure 中,必須手動解析 Program.cs 的服務。

請考慮 ASP.NET Core 3.1 或 5.0 Razor Pages 範本所產生的下列程式代碼:

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

先前程式代碼已移轉至新的精簡託管模型。

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

在上述程式代碼中, if (env.IsDevelopment()) 會移除 區塊,因為在 開發模式中,預設會啟用開發人員例外狀況頁面中間件。 如需詳細資訊,請參閱下一節 中 .NET 5 和 .NET 6 主控模型的 ASP.NET Core 之間的差異

使用自訂相依性插入(DI)框架時,新增以下加粗的程式碼:

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

使用最小裝載模型時,端點路由中介軟體會包裹整個中介軟體管線,因此不需要明確呼叫 UseRoutingUseEndpoints 來註冊路由。 UseRouting 仍可用來指定路由比對發生的位置,但如果中間件管線開頭應該比對路由,則不需要明確呼叫 UseRouting

在下列程式代碼中,對 UseRoutingUseEndpoints 的呼叫會從 Startup 中移除。 MapRazorPages 會在 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();

搭配新的最小裝載模型使用 Startup 時,請記住下列差異:

  • Program.cs 控制 Startup 類別的實例化和存留期。
  • 插入 Configure 方法的任何其他服務都必須由 Program 類別手動解析。

.NET 5 和 .NET 6 託管模型中的 ASP.NET Core 之間的差異

  • 開發模式中,預設會啟用開發人員例外狀況頁面中間件。
  • 應用程式名稱預設為進入點元件的名稱: Assembly.GetEntryAssembly().GetName().FullName。 在使用程式庫中的 WebApplicationBuilder 時,需將應用程式名稱明確變更為程式庫的組件,以便 MVC 的應用程式組件探索功能正常運作。 如需詳細指示,請參閱本檔中的更改內容根目錄、應用程式名稱和環境
  • 端點路由中間件會包裝整個中間件管線,因此不需要明確呼叫 UseRoutingUseEndpoints 註冊路由。 UseRouting 仍可用來指定路由比對發生的位置,但如果中間件管線開頭應該比對路由,則不需要明確呼叫 UseRouting
  • 管線會在任何IStartupFilter執行之前建立,因此在建置管線時所造成的例外狀況無法顯示於呼叫鏈結IStartupFilter
  • 某些工具,例如EF移轉,可用來 Program.CreateHostBuilder 存取應用程式的 IServiceProvider ,以在應用程式的內容中執行自定義邏輯。 這些工具已更新為使用新技術在應用程式內容中執行自定義邏輯。 Entity Framework 遷移 是一個以這種方式使用 Program.CreateHostBuilder 的工具範例。 我們正在努力確保工具已更新為使用新的模型。
  • 不同於 類別 Startup ,最小主機不會在具現化服務提供者時自動設定 DI 範圍。 對於需要範圍的情境,必須使用 IServiceScope,並透過 IServiceScopeFactory.CreateScope 來建立一個新的範圍。 如需詳細資訊,請參閱 如何在應用程式啟動時解析服務
  • 建立 之後WebApplicationBuilder,無法變更任何主機設定,例如應用程式名稱、環境或內容根目錄。 如需變更主機設定的詳細指示,請參閱 自訂 IHostBuilderIWebHostBuilder。 下列標示的 API 會拋出例外狀況:
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();
  • Startup類別無法從 WebApplicationBuilder.HostWebApplicationBuilder.WebHost使用。 下列突顯的程式代碼會拋出例外狀況:

    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();
    
  • IHostBuilderWebApplicationBuilderWebApplicationBuilder.Host)的實作,不會延遲執行 ConfigureServicesConfigureAppConfigurationConfigureHostConfiguration 方法。 不延遲執行可讓程式代碼使用 WebApplicationBuilder 觀察 對 IServiceCollectionIConfiguration所做的變更。 下列範例只會新增 Service1IService

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

在上述程式碼中,builder.Host.ConfigureServices 的回呼是內嵌執行的,而不是延遲到 builder.Build 被呼叫時才執行。 這表示 Service1 會在 Service2 之前新增至 IServiceCollection,並因此使 Service1 能夠被解析為 IService

在 .NET 6 中建置 ASP.NET Core 的連結庫

現有的 .NET 生態系統圍繞IServiceCollectionIHostBuilderIWebHostBuilder建置擴充性。 這些屬性作為 ServicesHostWebHostWebApplicationBuilder 上提供。

WebApplication 同時實作 Microsoft.AspNetCore.Builder.IApplicationBuilderMicrosoft.AspNetCore.Routing.IEndpointRouteBuilder

我們預期程式庫作者在建置 ASP.NET Core 特定元件時,會以 IHostBuilderIWebHostBuilderIApplicationBuilderIEndpointRouteBuilder 為目標繼續進行。 這可確保您的中間件、路由處理程式或其他擴充點可繼續在不同裝載模型中運作。

常見問題 (FAQ)

  • 新的簡約代管模型是否功能較弱?

    否。 新的裝載模型在功能上相當於和 IWebHostBuilder所支援IHostBuilder案例的 98%。 有一些進階案例需要 特定的 IHostBuilder因應措施,但我們預期這些案例非常罕見。

  • 泛型裝載模型已被廢棄嗎?

    否。 通用代管模型是可以無限期支援的替代模型。 通用主機支撐新的寄宿模型,並且仍然是托管以工人為基礎的應用程式的主要方式。

  • 我是否必須移轉至新的主機模式?

    否。 新的主控模型是使用 .NET 6 或更新版本裝載新應用程式的慣用方式,但您不會強制變更現有應用程式中的專案配置。 這表示應用程式可以從 .NET 5 升級至 .NET 6,方法是將專案檔中的目標架構從 net5.0 變更為 net6.0。 如需詳細資訊,請參閱本文中的 更新目標架構 一節。 不過,我們建議應用程式移轉至新的主控模型,以利用僅適用於新裝載模型的新功能。

  • 我是否必須使用最上層語句?

    否。 新的項目範本全都使用 最上層語句,但新的裝載 API 可用於任何 .NET 6 應用程式中來裝載 Web 伺服器或 Web 應用程式。

  • 我應該把存儲為ProgramStartup類別中欄位的狀態放在哪裡?

    我們強烈建議在 ASP.NET Core 應用程式中使用 依賴注入(DI)來管理狀態。

    有兩種方法可用來將狀態儲存在 DI 外部:

    • 將狀態儲存在另一個類別中。 儲存在類別中會假設靜態狀態可從應用程式中的任何位置存取。

    • Program使用最上層語句所產生的類別來儲存狀態。 使用 Program 來儲存狀態是語意方法:

      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; }
      }
      
  • 如果我使用自定義相依性插入容器,該怎麼辦?

    支援自定義 DI 容器。 如需範例,請參閱 自定義相依性插入 (DI) 容器

  • WebApplicationFactoryTestServer 是否還能運作?

    是的。 WebApplicationFactory<TEntryPoint> 是測試新託管模式的方式。 如需範例,請參閱使用 WebApplicationFactoryTestServer測試

Blazor

遵循本文稍早的指引,將應用程式更新為 .NET 6 之後,請遵循 .NET 6 中 ASP.NET Core 的新功能連結,以採用特定功能。

若要針對應用程式採用所有新的 6.0 功能Blazor,建議您執行下列程式:

  • 從其中Blazor一個專案範本建立新的6.0 Blazor 專案。 如需詳細資訊,請參閱 ASP.NET Core Blazor 工具。
  • 將應用程式的元件和程式代碼移至 6.0 應用程式進行修改,以採用新的 .NET 6 功能。

移轉 SPA 專案

從 SPA 擴充功能移轉 Angular 應用程式

請參閱這個 GitHub 問題

從 SPA 擴充功能移轉 React 應用程式

請參閱此 GitHub 問題中的從 Spa 擴充功能移轉 React 應用程式

更新 Docker 映像

針對使用 Docker 的應用程式,請更新 DockerfileFROM 陳述式和指令碼。 使用包含 ASP.NET Core 運行環境的 .NET 6 基礎映像。 請考慮在 .NET 5 和 .NET 6 中 ASP.NET Core 之間的下列 docker pull 命令差異:

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

請參閱 GitHub 問題 重大變更:預設控制台記錄器格式設定為 JSON

ASP.NET Core Razor SDK 的變更

編譯程式 Razor 現在會利用新的 來源產生器功能 ,從專案中的 Razor 檢視和頁面產生已編譯的 C# 檔案。 在舊版中:

  • 編譯依賴 RazorGenerateRazorCompile 目標來產生程式碼。 這些目標不再有效。 在 .NET 6 中,編譯程式的單一呼叫支援程式代碼產生和編譯。 RazorComponentGenerateDependsOn 仍然支援指定建置執行之前所需的相依性。
  • 已產生個別 Razor 的元件 AppName.Views.dll,其中包含應用程式中已編譯的檢視類型。 此行為已被取代,而且會產生單一元件 AppName.dll ,其中包含應用程式類型和產生的檢視。
  • 中的 AppName.Views.dll 應用程式類型是公用的。 在 .NET 6 中,應用程式類型位於 中 AppName.dll ,但 為 internal sealed。 在上 AppName.Views.dll 執行類型探索的應用程式將無法在 上 AppName.dll執行類型探索。 下列顯示 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>

進行下列變更:

  • 下列屬性不再適用於單一步驟編譯模型。
    • RazorTargetAssemblyAttribute
    • RazorTargetName
    • EnableDefaultRazorTargetAssemblyInfoAttributes
    • UseRazorBuildServer
    • GenerateRazorTargetAssemblyInfo
    • GenerateMvcApplicationPartsAssemblyAttributes

如需詳細資訊,請參閱 Razor 編譯程式不再產生 Views 元件

項目範本使用 Duende Identity 伺服器

專案範本現在使用 Duende Identity 伺服器

這很重要

Duende Identity Server 是具有相互許可協議的開放原始碼產品。 如果您打算在生產環境中使用 Duende 伺服器,您可能需要從 DuendeIdentity Software 取得商業授權,並支付授權費用。 如需詳細資訊,請參閱 Duende Software:授權

若要瞭解如何使用 Microsoft Azure Active Directory for ASP.NET Core Identity,請參閱Identity(dotnet/aspnetcore GitHub 存放庫)。

新增名為 Keys 的屬性至每個 IdentityDbContext,以滿足更新版本 IPersistedGrantDbContext 的新需求。 金鑰是 Duende Identity Server 存儲庫合約中的必要部分。

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

備註

必須針對 Duende Identity Server 重新建立現有的遷移。

移轉至 .NET 6 中 ASP.NET Core 的程式代碼範例

移轉至 6.0 中新的最小裝載模型程式碼範例

檢視重大更動

請參閱下列資源:

可空的參考型別 NRTs 和 .NET 編譯器空值狀態靜態分析

ASP.NET Core 專案範本使用可為 Null 的參考型別 (NRT),而 .NET 編譯程式會執行 Null 狀態靜態分析。 這些功能是以 C# 8 發行,預設會針對使用 .NET 6 (C# 10) 或更新版本中的 ASP.NET Core 所產生的應用程式啟用。

.NET 編譯器的 null 狀態靜態分析警告可以作為更新文件範例或本機範例應用程式的指引,或選擇忽略。 在應用程式的專案檔中 Nullable 設為 disable ,即可停用 Null 狀態靜態分析。只有在編譯器警告在學習 .NET 時造成干擾時,我們才建議針對文件範例和範例應用程式使用此設置。 不建議在生產專案中停用空值狀態檢查。

如需 NRT、MSBuild Nullable 屬性和更新應用程式的詳細資訊(包括 #pragma 指引),請參閱 C# 檔中的下列資源:

ASP.NET Core 模組 (ANCM)

如果在安裝 Visual Studio 時,ASP.NET Core 模組 (ANCM) 不是選取的元件,或者如果系統上已安裝舊版的 ANCM,請下載最新的 .NET Core 裝載套件組合安裝程式 (直接下載),並執行安裝程式。 如需詳細資訊,請參閱裝載組合套件

應用程式名稱變更

在 .NET 6 中,WebApplicationBuilder 會將內容根路徑正規化,使其以 DirectorySeparatorChar 結尾。 大部分從 HostBuilderWebHostBuilder 移轉的應用程式都不會有相同的應用程式名稱,因為這些應用程式並未正規化。 如需詳細資訊,請參閱 SetApplicationName

其他資源