この記事では、.NET 5 プロジェクトの既存の ASP.NET Core を .NET 6 に更新する方法について説明します。 ASP.NET Core 3.1 から .NET 6 に移行する方法については、「 ASP.NET Core 3.1 から .NET 6 への移行」を参照してください。
[前提条件]
- ASP.NET および Web 開発ワークロードを含む Visual Studio 2022。
- .NET 6 SDK
で .NET SDK のバージョンを更新する global.json
特定の .NET SDK バージョンを対象とする global.json
ファイルに依存している場合は、 version
プロパティをインストールされている .NET 6 SDK バージョンに更新します。 例えば次が挙げられます。
{
"sdk": {
- "version": "5.0.100"
+ "version": "6.0.100"
}
}
ターゲット フレームワークを更新する
プロジェクト ファイルのターゲット フレームワーク モニカー (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 最小ホスティング モデルでは、1 つのファイルと数行のコードのみが必要です。 .NET 6 に移行するアプリでは、新しい最小ホスティング モデルを使用する必要はありません。 詳細については、次のセクションの「 .NET 6 に移行するアプリでは、新しい最小ホスティング モデルを使用する必要はありません 」を参照してください。
ASP.NET Core 空のテンプレートの次のコードは、新しい最小ホスティング モデルを使用してアプリを作成します。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
最小ホスティング モデル:
- アプリの作成に必要なファイルとコード行の数が大幅に減ります。 4 行のコードで必要なファイルは 1 つだけです。
Startup.cs
とProgram.cs
を 1 つのProgram.cs
ファイルに統合します。- 最上位レベルのステートメントを使用して、アプリに必要なコードを最小限に抑えます。
- グローバル
using
ディレクティブを使用して、必要なusing
ステートメント行の数を排除または最小化します。
次のコードは、.NET 5 Web App テンプレート (Startup.cs
Pages) のProgram.cs
ファイルとRazor ファイルを表示し、未使用の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 サンプルは、次の方法を示しています。
- ConfigureServices が
WebApplication.Services
に置き換えられます。 builder.Build()
は、構成された WebApplication を変数app
に返します。 Configure は、app
を使用して同じサービスへの構成呼び出しに置き換えられます。
最小限のホスティング モデルを使用して .NET 5 Startup
コードの ASP.NET Core を .NET 6 に移行する詳細な例については、このドキュメントの後半で説明します。
Web アプリ テンプレート用に生成された他のファイルには、いくつかの変更があります。
Index.cshtml
とPrivacy.cshtml
は未使用のusing
ステートメントが削除されました。RequestId
inError.cshtml
は null 許容参照型 (NRT) として宣言されています。
- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
- ログ レベルの既定値は、
appsettings.json
とappsettings.Development.json
で変更されています。
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
+ "Microsoft.AspNetCore": "Warning"
上記の ASP.NET Core テンプレート コードでは、 "Microsoft": "Warning"
が "Microsoft.AspNetCore": "Warning"
に変更されました。 この変更により、Microsoft
名前空間からのをすべての情報メッセージがログに記録されます。 たとえば、 Microsoft.EntityFrameworkCore
は情報レベルでログに記録されるようになりました。
新しいホスティング モデルの詳細については、「 よく寄せられる質問 」セクションを参照してください。 NRT と .NET コンパイラの null 状態分析の導入の詳細については、「 Null 許容参照型 (NRT) と .NET コンパイラの null 状態静的分析 」セクションを参照してください。
6.0 以降に移行または使用するアプリでは、新しい最小ホスティング モデルを使用する必要はありません
Startup
と、ASP.NET Core 3.1 および 5.0 テンプレートで使用される汎用ホストの使用は完全にサポートされています。
新しい最小ホスティング モデルでスタートアップを使用する
ASP.NET Core 3.1 および 5.0 アプリでは、新しい最小ホスティング モデルで Startup
コードを使用できます。 最小限のホスティング モデルで Startup
を使用すると、次のような利点があります。
Startup
クラスを呼び出すために非表示のリフレクションは使用されません。- 開発者が
Startup
の呼び出しを制御するため、非同期コードを記述できます。 ConfigureServices
とConfigure
をインターリーブするコードを記述できます。
新しい最小ホスティング モデルで Startup
コードを使用する場合の小さな制限の 1 つは、依存関係を 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 の ASP.NET Core と .NET 6 ホスティング モデルの違い 」を参照してください。
カスタム依存関係挿入 (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();
});
}
}
最小ホスティング モデルを使用する場合、エンドポイント ルーティング ミドルウェアはミドルウェア パイプライン全体をラップするため、ルートを登録するために UseRouting
または UseEndpoints
を明示的に呼び出す必要はありません。 UseRouting
は引き続きルートの照合を行う場所を指定するために使用できますが、ミドルウェア パイプラインの先頭でルートを照合する必要がある場合は、UseRouting
を明示的に呼び出す必要はありません。
次のコードでは、 UseRouting
と UseEndpoints
の呼び出しが 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 の アプリケーション パーツの検出 を機能させるために、アプリ名をライブラリのアセンブリに明示的に変更します。 詳細な手順については、このドキュメントの コンテンツ ルート、アプリ名、環境の変更 に関するページを参照してください。 - エンドポイント ルーティング ミドルウェアはミドルウェア パイプライン全体をラップするため、ルートを登録するために
UseRouting
またはUseEndpoints
を明示的に呼び出す必要はありません。UseRouting
は引き続きルートの照合を行う場所を指定するために使用できますが、ミドルウェア パイプラインの先頭でルートを照合する必要がある場合は、UseRouting
を明示的に呼び出す必要はありません。 - パイプラインは、IStartupFilterが実行される前に作成されるため、パイプラインの構築中に発生した例外は、
IStartupFilter
呼び出しチェーンには表示されません。 - EF 移行などの一部のツールでは、
Program.CreateHostBuilder
を使用してアプリのIServiceProvider
にアクセスし、アプリのコンテキストでカスタム ロジックを実行します。 これらのツールは、アプリのコンテキストでカスタム ロジックを実行する新しい手法を使用するように更新されました。 Entity Framework Migrations は、この方法でProgram.CreateHostBuilder
を使用するツールの例です。 新しいモデルを使用するようにツールが更新されるように取り組んでいます。 Startup
クラスとは異なり、最小限のホストは、サービス プロバイダーをインスタンス化するときに DI スコープを自動的に構成しません。 スコープが必要なコンテキストの場合は、IServiceScope でを呼び出して新しいスコープをインスタンス化する必要があります。 詳細については、 アプリの起動時にサービスを解決する方法を参照してください。- の作成後に、アプリ名、環境、コンテンツ ルートなどのホスト設定を変更。 ホスト設定を変更する方法の詳細については、「
IHostBuilder
またはIWebHostBuilder
のカスタマイズ」を参照してください。 次の強調表示された 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.Host
またはWebApplicationBuilder.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();
IHostBuilder (WebApplicationBuilder) での
WebApplicationBuilder.Host
の実装では、ConfigureServices、ConfigureAppConfiguration、またはConfigureHostConfigurationメソッドの実行は延期されません。 実行を遅延しない場合、 WebApplicationBuilder を使用するコードは、IServiceCollection
とIConfiguration
に加えられた変更を観察できます。 次の例では、Service1
を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 { }
前のコードでは、 builder.Host.ConfigureServices
コールバックは、 builder.Build
が呼び出されるまで遅延されるのではなく、インラインで呼び出されます。 つまり、Service1
はIServiceCollection
の前にService2
に追加され、Service1
がIService
のために解決されます。
.NET 6 での ASP.NET Core 用ライブラリのビルド
既存の .NET エコシステムは、 IServiceCollection、 IHostBuilder、 IWebHostBuilderに関する拡張性を構築しました。 これらのプロパティは、WebApplicationBuilder、Services
、およびHost
としてWebHost
で使用できます。
WebApplication
は、 Microsoft.AspNetCore.Builder.IApplicationBuilder と Microsoft.AspNetCore.Routing.IEndpointRouteBuilderの両方を実装します。
ライブラリ作成者は、ASP.NET Core コンポーネントを構築する際に、IHostBuilder
、IWebHostBuilder
、IApplicationBuilder
、およびIEndpointRouteBuilder
を引き続きターゲットにすることを期待しています。 これにより、ミドルウェア、ルート ハンドラー、またはその他の拡張ポイントが、異なるホスティング モデル間で引き続き機能します。
よく寄せられる質問 (FAQ)
新しい最小ホスティング モデルの能力は低いですか?
いいえ。 新しいホスティング モデルは、
IHostBuilder
とIWebHostBuilder
でサポートされる 98% のシナリオで機能的に同等です。IHostBuilder
には特定の回避策が必要な高度なシナリオがいくつかありますが、非常にまれなものになると予想されます。汎用ホスティング モデルは非推奨ですか?
いいえ。 汎用ホスティング モデルは、無期限にサポートされる代替モデルです。 汎用ホストは新しいホスティング モデルを支え、ワーカー ベースのアプリケーションをホストするための主要な方法です。
新しいホスティング モデルに移行する必要がありますか?
いいえ。 新しいホスティング モデルは、.NET 6 以降を使用して新しいアプリをホストする場合に推奨される方法ですが、既存のアプリでプロジェクト レイアウトを変更する必要はありません。 つまり、プロジェクト ファイル内のターゲット フレームワークを
net5.0
からnet6.0
に変更することで、アプリを .NET 5 から .NET 6 にアップグレードできます。 詳細については、この記事の 「ターゲット フレームワークの更新 」セクションを参照してください。 ただし、新しいホスティング モデルでのみ使用できる新機能を利用するには、アプリを新しいホスティング モデルに移行することをお勧めします。最上位レベルのステートメントを使用する必要がありますか?
いいえ。 新しいプロジェクト テンプレートはすべて 最上位レベルのステートメントを使用しますが、新しいホスティング API は任意の .NET 6 アプリで Web サーバーまたは Web アプリをホストするために使用できます。
Program
またはStartup
クラスのフィールドとして格納された状態はどこに配置すればよいですか?依存関係の挿入 (DI) を使用して、ASP.NET Core アプリの状態を管理することを強くお勧めします。
DI の外部に状態を格納するには、次の 2 つの方法があります。
状態を別のクラスに格納します。 クラスに格納すると、アプリ内のどこからでもアクセスできる静的な状態が想定されます。
状態を格納するには、最上位レベルのステートメントによって生成された
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) コンテナー」を参照してください。
WebApplicationFactory
とTestServer
は引き続き機能しますか?はい。
WebApplicationFactory<TEntryPoint>
は、新しいホスティング モデルをテストする方法です。 例については、「WebApplicationFactory
またはTestServer
を使用したテスト」を参照してください。
Blazor
この記事の前半のガイダンスに従ってアプリを .NET 6 に更新した後、.NET 6 の ASP.NET Core の新機能のリンクに従って、特定の機能を採用します。
Blazor アプリのすべての新しい 6.0 機能を採用するには、次のプロセスをお勧めします。
- Blazor プロジェクト テンプレートの 1 つから新しい 6.0 Blazor プロジェクトを作成します。 詳しくは、「ASP.NET Core Blazor 用のツール」をご覧ください。
- 新しい .NET 6 機能を採用するように変更を加えて、アプリのコンポーネントとコードを 6.0 アプリに移動します。
SPA プロジェクトの移行
SPA 拡張機能からの Angular アプリの移行
こちらの GitHub の issue を参照してください
SPA 拡張機能からの React アプリの移行
この GitHub の問題の Spa 拡張機能からの React アプリケーションの移行を参照してください
Docker イメージの更新
Docker を使用するアプリの場合、DockerfileFROM
ステートメントおよびスクリプトを更新します。 .NET 6 ランタイムの ASP.NET Core を含む基本イメージを使用します。 .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 の issue にある破壊的変更: 既定のコンソール ロガー形式が JSON に設定されましたを参照してください。
ASP.NET Core Razor SDK の変更
Razor コンパイラは、新しいソース ジェネレーター機能を利用して、プロジェクト内のRazor ビューとページからコンパイル済みの C# ファイルを生成するようになりました。 以前のバージョンでは、
- コンパイルは、生成されたコードを生成するために
RazorGenerate
とRazorCompile
ターゲットに依存していました。 これらのターゲットは無効になっています。 .NET 6 では、コードの生成とコンパイルの両方が、コンパイラへの 1 回の呼び出しでサポートされています。RazorComponentGenerateDependsOn
は、ビルドの実行前に必要な依存関係を指定するために引き続きサポートされています。 - 別の Razor アセンブリ (
AppName.Views.dll
) が生成されました。このアセンブリには、コンパイルされたビューの種類がアプリケーションに含まれています。 この動作は非推奨となり、アプリの種類と生成されたビューの両方を含む 1 つのアセンブリAppName.dll
が生成されます。 AppName.Views.dll
のアプリの種類はパブリックでした。 .NET 6 では、アプリの種類はAppName.dll
にありますが、internal sealed
。AppName.Views.dll
で type discover を実行しているアプリは、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 Server を使用する
プロジェクト テンプレートで Duende Identity Server が使用されるようになりました。
Von Bedeutung
Duende Identity Server は、相互ライセンス契約を持つオープン ソース製品です。 運用環境で Duende Identity Server を使用する場合は、 Duende Software から商用ライセンスを取得し、ライセンス料金を支払う必要がある場合があります。 詳細については、「 Duende Software: Licenses」を参照してください。
ASP.NET Core に Identity を使用する方法については、Identity (dotnet/aspnetcore GitHub リポジトリ) を参照してください。
更新されたバージョンのDbSet<Key>
の新しい要件を満たすために、Keys
という名前のIdentityDbContext
プロパティをすべてのIPersistedGrantDbContext
に追加します。 Duende Identity Server のストアとの契約の一部として、キーが必要です。
public DbSet<Key> Keys { get; set; }
注
Duende Identity Server の既存の移行を再作成する必要があります。
.NET 6 の ASP.NET Core に移行されたコード サンプル
6.0 で新しい最小ホスティング モデルに移行されたコード サンプル
破壊的変更の確認
次のリソースを参照してください。
- Identity: UI の既定のブートストラップ バージョンが変更されました
- バージョン .NET 5 から .NET 6 への移行に関する破壊的変更: ASP.NET Core と Entity Framework Core が含まれます。
- お知らせ GitHub リポジトリ (aspnet/Announcements、
6.0.0
ラベル):破壊的情報と非破壊的情報が含まれます。
null 許容参照型 (NRT) と .NET コンパイラの null 状態スタティック分析
ASP.NET Core プロジェクト テンプレートでは null 許容参照型 (NRT) が使用され、.NET コンパイラは null 状態の静的分析を実行します。 これらの機能は C# 8 でリリースされ、.NET 6 (C# 10) 以降の ASP.NET Core を使用して生成されたアプリに対して既定で有効になっています。
.NET コンパイラの null 状態の静的分析の警告は、ドキュメントの例またはサンプル アプリをローカルで更新するためのガイドとして機能するか、無視することができます。 null 状態の静的分析を無効にするには、Nullable
をアプリのプロジェクト ファイルでdisable
に設定します。これは、.NET について学習中にコンパイラの警告が気が散る場合にのみ、ドキュメントの例とサンプル アプリに対してのみお勧めします。 運用プロジェクトで null 状態チェックを無効にすることはお勧めしません。
NRT、MSBuild Nullable
プロパティ、アプリの更新 ( #pragma
ガイダンスを含む) の詳細については、C# ドキュメントの次のリソースを参照してください。
- Null 許容参照型
- Null 許容参照型 (C# リファレンス)
- null 許容の警告を解決する手法を学ぶ
- null 診断警告を改善するために、null 許容参照型を使用してコードベースを更新する
- null 状態の静的分析の属性
- ! (null 免除) 演算子 (C# リファレンス)
ASP.NET Core モジュール (ANCM)
Visual Studio のインストール時に ASP.NET Core モジュール (ANCM) が選択されたコンポーネントではなかった場合、または ANCM の以前のバージョンがシステムにインストールされていた場合は、最新の .NET Core ホスティング バンドル インストーラー (直接ダウンロード) をダウンロードし、インストーラーを実行します。 詳細については、「ホスティング バンドル」を参照してください。
アプリケーション名の変更
.NET 6 では、WebApplicationBuilder によって、コンテンツのルート パスが DirectorySeparatorChar で終わるように正規化されます。 HostBuilderまたはWebHostBuilderから移行するほとんどのアプリは、正規化されていないため、同じアプリ名を持ちません。 詳細については、「SetApplicationName」を参照してください。
その他のリソース
ASP.NET Core