次の方法で共有


ASP.NET Core 1.x から 2.0 に移行する

作成者: Scott Addie

この記事では、既存の ASP.NET Core 1.x プロジェクトを ASP.NET Core 2.0 に更新する手順について説明します。 アプリケーションを ASP.NET Core 2.0 に移行すると、 多くの新機能とパフォーマンスの向上を利用できます

既存の ASP.NET Core 1.x アプリケーションは、バージョン固有のプロジェクト テンプレートに基づいています。 ASP.NET Core フレームワークが進化するにつれて、プロジェクト テンプレートとその中に含まれるスターター コードも進化します。 ASP.NET Core フレームワークを更新するだけでなく、アプリケーションのコードを更新する必要があります。

[前提条件]

ASP.NET Core の概要」を参照してください。

ターゲット フレームワーク モニカー (TFM) を更新する

.NET Core を対象とするプロジェクトでは、.NET Core 2.0 以上のバージョンの TFM を使用する必要があります。 <TargetFramework> ファイル内の.csproj ノードを検索し、その内部テキストをnetcoreapp2.0に置き換えます。

<TargetFramework>netcoreapp2.0</TargetFramework>

.NET Framework を対象とするプロジェクトでは、.NET Framework 4.6.1 以上のバージョンの TFM を使用する必要があります。 <TargetFramework> ファイル内の.csproj ノードを検索し、その内部テキストをnet461に置き換えます。

<TargetFramework>net461</TargetFramework>

.NET Core 2.0 は、.NET Core 1.x よりもはるかに大きなサーフェス領域を提供します。 .NET Core 1.x の API が不足しているためだけに .NET Framework を対象としている場合は、.NET Core 2.0 をターゲットにすると機能する可能性があります。

プロジェクト ファイルに <RuntimeFrameworkVersion>1.{sub-version}</RuntimeFrameworkVersion>が含まれている場合は、 この GitHub の問題を参照してください。

で .NET Core SDK のバージョンを更新する global.json

ソリューションが特定の .NET Core SDK バージョンをターゲットとする global.json ファイルに依存している場合は、コンピューターにインストールされている 2.0 バージョンを使用するように、 version プロパティを更新します。

{
  "sdk": {
    "version": "2.0.0"
  }
}

パッケージ参照の更新

1.x プロジェクトの .csproj ファイルには、プロジェクトで使用される各 NuGet パッケージが一覧表示されます。

.NET Core 2.0 をターゲットとする ASP.NET Core 2.0 プロジェクトでは、 ファイル内の 1 つの.csproj参照によってパッケージのコレクションが置き換えられます。

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
</ItemGroup>

ASP.NET Core 2.0 と Entity Framework Core 2.0 のすべての機能がメタパッケージに含まれています。

ASP.NET .NET Framework を対象とする Core 2.0 プロジェクトでは、個々の NuGet パッケージを引き続き参照する必要があります。 各Version ノードの<PackageReference />属性を 2.0.0 に更新します。

たとえば、.NET Framework をターゲットとする一般的な ASP.NET Core 2.0 プロジェクトで使用される <PackageReference /> ノードの一覧を次に示します。

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.0" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
  <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
  <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.0" />
  <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" />
</ItemGroup>

パッケージ Microsoft.Extensions.CommandLineUtils廃止されました。 引き続き使用できますが、サポートされていません。

.NET CLI ツールを更新する

.csproj ファイルで、各Version ノードの<DotNetCliToolReference />属性を 2.0.0 に更新します。

たとえば、.NET Core 2.0 をターゲットとする一般的な ASP.NET Core 2.0 プロジェクトで使用される CLI ツールの一覧を次に示します。

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>

パッケージ ターゲット フォールバック プロパティの名前を変更する

1.x プロジェクトの .csproj ファイルでは、 PackageTargetFallback ノードと変数が使用されています。

<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>

ノードと変数の両方の名前を AssetTargetFallbackに変更します。

<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

Program.csで Main メソッドを更新する

1.x プロジェクトでは、MainProgram.csメソッドは次のようになります。

using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore1App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            host.Run();
        }
    }
}

2.0 プロジェクトでは、MainProgram.csメソッドが簡略化されました。

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

この新しい 2.0 パターンの導入を強くお勧めします。 Entity Framework (EF) Core Migrations などの製品機能を機能させるには必要です。 たとえば、パッケージ マネージャー コンソール ウィンドウから Update-Database を実行するか、コマンド ラインから (ASP.NET Core 2.0 に変換されたプロジェクトで) dotnet ef database update すると、次のエラーが生成されます。

Unable to create an object of type '<Context>'. Add an implementation of 'IDesignTimeDbContextFactory<Context>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

構成プロバイダーの追加

1.x プロジェクトでは、 Startup コンストラクターを使用して構成プロバイダーをアプリに追加しました。 手順には、 ConfigurationBuilderのインスタンスの作成、適用可能なプロバイダー (環境変数、アプリ設定など) の読み込み、 IConfigurationRootのメンバーの初期化が含まれます。

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        builder.AddUserSecrets<Startup>();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

前の例では、Configurationから構成設定を持つappsettings.json メンバーと、appsettings.{Environment}.json プロパティに一致するIHostingEnvironment.EnvironmentName ファイルを読み込みます。 これらのファイルの場所は、 Startup.csと同じパスにあります。

2.0 プロジェクトでは、1.x プロジェクトに固有の定型構成コードがバックグラウンドで実行されます。 たとえば、環境変数とアプリ設定は起動時に読み込まれます。 同等の Startup.cs コードは、挿入されたインスタンスを使用して初期化 IConfiguration に減らされます。

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

public IConfiguration Configuration { get; }

WebHostBuilder.CreateDefaultBuilderによって追加された既定のプロバイダーを削除するには、Clear内の IConfigurationBuilder.Sources プロパティでConfigureAppConfiguration メソッドを呼び出します。 プロバイダーを再度追加するには、ConfigureAppConfigurationProgram.cs メソッドを利用します。

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((hostContext, config) =>
        {
            // delete all default configuration providers
            config.Sources.Clear();
            config.AddJsonFile("myconfig.json", optional: true);
        })
        .Build();

前のコード スニペットの CreateDefaultBuilder メソッドで使用される構成を次に示 します

詳細については、「ASP.NET Core の構成」を参照してください。

データベース初期化コードの移動

EF Core 1.x を使用する 1.x プロジェクトでは、dotnet ef migrations addなどのコマンドによって次の処理が実行されます。

  1. Startup インスタンスをインスタンス化します
  2. ConfigureServices メソッドを呼び出して、依存関係の挿入 (DbContext型を含む) を持つすべてのサービスを登録します。
  3. 必要なタスクを実行します

EF Core 2.0 を使用する 2.0 プロジェクトでは、アプリケーション サービスを取得するためにProgram.BuildWebHostが呼び出されます。 1.x とは異なり、これは Startup.Configureを呼び出すことによる追加の副作用があります。 1.x アプリが Configure メソッドでデータベース初期化コードを呼び出した場合、予期しない問題が発生する可能性があります。 たとえば、データベースがまだ存在しない場合、シード処理コードは EF Core Migrations コマンドの実行前に実行されます。 この問題により、データベースがまだ存在しない場合、 dotnet ef migrations list コマンドが失敗します。

ConfigureStartup.csメソッドでは、次の 1.x シード初期化コードを検討してください。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

SeedData.Initialize(app.ApplicationServices);

2.0 プロジェクトで、SeedData.Initialize呼び出しを MainProgram.cs メソッドに移動します。

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    try
    {
        // Requires using RazorPagesMovie.Models;
        SeedData.Initialize(services);
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "An error occurred seeding the DB.");
    }
}

host.Run();

2.0 の時点では、Web ホストのビルドと構成を除き、 BuildWebHost で何かを行うのが不適切です。 アプリケーションの実行については、通常、BuildWebHostMainメソッドで、Program.csの外部で処理する必要があります。

Razor ビューコンパイル設定を確認する

アプリケーションの起動時間を短縮し、発行されたバンドルを小さくすることが最も重要です。 このような理由から、 Razor ビューのコンパイル は、ASP.NET Core 2.0 で既定で有効になっています。

MvcRazorCompileOnPublish プロパティを true に設定する必要はなくなりました。 ビューのコンパイルを無効にしない限り、プロパティは .csproj ファイルから削除される可能性があります。

.NET Framework を対象とする場合でも、.csproj NuGet パッケージ:

<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />

Application Insights の "ライトアップ" 機能に依存する

アプリケーション パフォーマンス インストルメンテーションの簡単なセットアップが重要です。 Visual Studio 2017 ツールで使用できる新しい Application Insights の "ライトアップ" 機能に依存できるようになりました。

ASP.NET Visual Studio 2017 で作成された Core 1.1 プロジェクトでは、既定で Application Insights が追加されました。 Program.csおよびStartup.csの外部で Application Insights SDK を直接使用していない場合は、次の手順に従います。

  1. .NET Core を対象とする場合は、<PackageReference /> ファイルから次の.csproj ノードを削除します。

    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
    
  2. .NET Core を対象とする場合は、UseApplicationInsightsからProgram.cs拡張メソッドの呼び出しを削除します。

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();
    
        host.Run();
    }
    
  3. _Layout.cshtmlから Application Insights クライアント側 API 呼び出しを削除します。 次の 2 行のコードで構成されます。

    @inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet
    @Html.Raw(JavaScriptSnippet.FullScript)
    

Application Insights SDK を直接使用している場合は、引き続き使用します。 2.0 メタパッケージ には最新バージョンの Application Insights が含まれているため、古いバージョンを参照している場合はパッケージのダウングレード エラーが表示されます。

認証/Identity の機能強化を採用する

ASP.NET Core 2.0 には、新しい認証モデルと、ASP.NET Core Identityに対する多くの重要な変更があります。 個々のユーザー アカウントを有効にしてプロジェクトを作成した場合、または認証または Identityを手動で追加した場合は、「 ASP.NET Core 2.0 への認証と Identity の移行」を参照してください。

その他のリソース