次の方法で共有


.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 への移行」を参照してください。

[前提条件]

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

最小ホスティング モデル:

次のコードは、.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 サンプルは、次の方法を示しています。

最小限のホスティング モデルを使用して .NET 5 Startup コードの ASP.NET Core を .NET 6 に移行する詳細な例については、このドキュメントの後半で説明します。

Web アプリ テンプレート用に生成された他のファイルには、いくつかの変更があります。

  • Index.cshtmlPrivacy.cshtmlは未使用のusingステートメントが削除されました。
  • RequestId in Error.cshtmlnull 許容参照型 (NRT) として宣言されています。
- public string RequestId { get; set; }
+ public string? RequestId { get; set; }
  • ログ レベルの既定値は、 appsettings.jsonappsettings.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の呼び出しを制御するため、非同期コードを記述できます。
  • ConfigureServicesConfigureをインターリーブするコードを記述できます。

新しい最小ホスティング モデルで 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 を明示的に呼び出す必要はありません。

次のコードでは、 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 の アプリケーション パーツの検出 を機能させるために、アプリ名をライブラリのアセンブリに明示的に変更します。 詳細な手順については、このドキュメントの コンテンツ ルート、アプリ名、環境の変更 に関するページを参照してください。
  • エンドポイント ルーティング ミドルウェアはミドルウェア パイプライン全体をラップするため、ルートを登録するために 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の実装では、ConfigureServicesConfigureAppConfiguration、またはConfigureHostConfigurationメソッドの実行は延期されません。 実行を遅延しない場合、 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 が呼び出されるまで遅延されるのではなく、インラインで呼び出されます。 つまり、Service1IServiceCollectionの前にService2に追加され、Service1IServiceのために解決されます。

.NET 6 での ASP.NET Core 用ライブラリのビルド

既存の .NET エコシステムは、 IServiceCollectionIHostBuilderIWebHostBuilderに関する拡張性を構築しました。 これらのプロパティは、WebApplicationBuilderServices、およびHostとしてWebHostで使用できます。

WebApplication は、 Microsoft.AspNetCore.Builder.IApplicationBuilderMicrosoft.AspNetCore.Routing.IEndpointRouteBuilderの両方を実装します。

ライブラリ作成者は、ASP.NET Core コンポーネントを構築する際に、IHostBuilderIWebHostBuilderIApplicationBuilder、およびIEndpointRouteBuilderを引き続きターゲットにすることを期待しています。 これにより、ミドルウェア、ルート ハンドラー、またはその他の拡張ポイントが、異なるホスティング モデル間で引き続き機能します。

よく寄せられる質問 (FAQ)

  • 新しい最小ホスティング モデルの能力は低いですか?

    いいえ。 新しいホスティング モデルは、 IHostBuilderIWebHostBuilderでサポートされる 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) コンテナー」を参照してください。

  • WebApplicationFactoryTestServerは引き続き機能しますか?

    はい。 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# ファイルを生成するようになりました。 以前のバージョンでは、

  • コンパイルは、生成されたコードを生成するために RazorGenerateRazorCompile ターゲットに依存していました。 これらのターゲットは無効になっています。 .NET 6 では、コードの生成とコンパイルの両方が、コンパイラへの 1 回の呼び出しでサポートされています。 RazorComponentGenerateDependsOn は、ビルドの実行前に必要な依存関係を指定するために引き続きサポートされています。
  • 別の Razor アセンブリ ( AppName.Views.dll) が生成されました。このアセンブリには、コンパイルされたビューの種類がアプリケーションに含まれています。 この動作は非推奨となり、アプリの種類と生成されたビューの両方を含む 1 つのアセンブリ AppName.dll が生成されます。
  • AppName.Views.dllのアプリの種類はパブリックでした。 .NET 6 では、アプリの種類は AppName.dll にありますが、 internal sealedAppName.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 で新しい最小ホスティング モデルに移行されたコード サンプル

破壊的変更の確認

次のリソースを参照してください。

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# ドキュメントの次のリソースを参照してください。

ASP.NET Core モジュール (ANCM)

Visual Studio のインストール時に ASP.NET Core モジュール (ANCM) が選択されたコンポーネントではなかった場合、または ANCM の以前のバージョンがシステムにインストールされていた場合は、最新の .NET Core ホスティング バンドル インストーラー (直接ダウンロード) をダウンロードし、インストーラーを実行します。 詳細については、「ホスティング バンドル」を参照してください。

アプリケーション名の変更

.NET 6 では、WebApplicationBuilder によって、コンテンツのルート パスが DirectorySeparatorChar で終わるように正規化されます。 HostBuilderまたはWebHostBuilderから移行するほとんどのアプリは、正規化されていないため、同じアプリ名を持ちません。 詳細については、「SetApplicationName」を参照してください。

その他のリソース