ASP.NET Core 2.0 から 2.1 への移行

作成者: Rick Anderson

ASP.NET Core 2.1 の新機能の概要については、「ASP.NET Core 2.1の新機能」を参照してください。

この記事の内容:

  • 2.0 アプリから 2.1 への ASP.NET Coreの基本について説明します。
  • Web アプリケーション テンプレートに対する ASP.NET Core概要を示します。

2.1 の変更の概要を簡単に確認するには、次の方法があります。

  • WebApp1 ASP.NET Core 2.0 Web アプリを作成します。
  • ソース管理システムで WebApp1 をコミットします。
  • WebApp1 を削除し、同 ASP.NET Core WebApp1 という名前の 2.1 Web アプリを作成します。
  • 2.1 バージョンの変更点を確認します。

この記事では、ASP.NET Core 2.1 への移行の概要について説明します。 バージョン 2.1 への移行に必要なすべての変更の完全な一覧は含め "されません"。 一部のプロジェクトでは、プロジェクトの作成時に選択したオプションと、プロジェクトに対して行われた変更に応じて、さらに多くの手順が必要になる場合があります。

2.1 バージョンを使用するようにプロジェクト ファイルを更新する

プロジェクト ファイルを更新します。

  • プロジェクト ファイルを に更新して、ターゲット フレームワークを .NET Core 2.1 に変更します <TargetFramework>netcoreapp2.1</TargetFramework>
  • のパッケージ参照を の Microsoft.AspNetCore.All パッケージ参照に置き換える Microsoft.AspNetCore.App 。 から削除された依存関係を追加する必要がある場合があります Microsoft.AspNetCore.All 。 詳細については、次のトピックを参照してください。 ASP.NET Core 2.0 用の Microsoft.AspNetCore.All メタパッケージ および ASP.NET Core 用の Microsoft.AspNetCore.App メタパッケージ
  • へのパッケージ参照の "Version" 属性を削除します Microsoft.AspNetCore.App 。 を使用する <Project Sdk="Microsoft.NET.Sdk.Web"> プロジェクトでは、バージョンを設定する必要があります。 バージョンはターゲット フレームワークによって暗黙的に指定され、2.1 の動作に最適 ASP.NET Core選択されます。 詳細については、「共有フレームワークを対象とする プロジェクトのルール」セクションを参照 してください。
  • アプリを対象とするアプリ.NET Framework、各パッケージ参照を 2.1 に更新します。
  • 次のパッケージの < DotNetCliToolReference > 要素への参照を削除します。 これらのツールは既定で .NET Core CLIバンドルされ、個別にインストールする必要があります。
    • Microsoft.DotNet.Watcher.Tools ( dotnet watch )
    • Microsoft.EntityFrameworkCore.Tools.DotNet ( dotnet ef )
    • Microsoft.Extensions.Caching.SqlConfig.Tools ( dotnet sql-cache )
    • Microsoft.Extensions.SecretManager.Tools ( dotnet user-secrets )
  • 省略可能: の < DotNetCliToolReference > 要素を削除 できます Microsoft.VisualStudio.Web.CodeGeneration.Tools 。 を実行することで、このツールをグローバルにインストールされたバージョンに置き換できます dotnet tool install -g dotnet-aspnet-codegenerator
  • 2.1 では、ファイルを Razor 配布するためにクラス ライブラリが推奨 Razor されるソリューションです。 アプリが埋め込みビューを使用している場合、またはファイルのランタイム コンパイルに依存している場合は、プロジェクト ファイルの に Razor <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory> <PropertyGroup> を追加します。

次のマークアップは、テンプレートによって生成された 2.0 プロジェクト ファイルを示しています。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>aspnet-{Project Name}-{GUID}</UserSecretsId>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.9" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.3" PrivateAssets="All" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.4" PrivateAssets="All" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
    <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.2" />
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" />
  </ItemGroup>
</Project>

次のマークアップは、テンプレートによって生成された 2.1 プロジェクト ファイルを示しています。

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <UserSecretsId>aspnet-{Project Name}-{GUID}</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" PrivateAssets="All" />
  </ItemGroup>

</Project>

共有フレームワークを対象とするプロジェクトのルール

共有フレームワーク は、アプリのフォルダー内にはない一連のアセンブリ (.dll ファイル) です。 共有フレームワークは、アプリを実行するコンピューター上にインストールする必要があります。 詳しくは、共有フレームワークに関するページをご覧ください。

ASP.NET Core 2.1 には、次の共有フレームワークが含まれています。

パッケージ参照で指定されたバージョンは、最低限 必要なバージョン です。 たとえば、これらのパッケージの 2.1.1 バージョンを参照するプロジェクトは、2.1.0 ランタイムだけがインストールされているマシンでは実行されません。

共有フレームワークを対象とするプロジェクトの既知の問題:

  • .NET Core 2.1.300 SDK (Visual Studio 15.6 に最初に含まれています) では、 の暗黙的なバージョンが Microsoft.AspNetCore.App 2.1.0 に設定され、Entity Framework Core 2.1.1 との競合が発生しました。 推奨される解決策は、.NET Core SDK 2.1.301 以降にアップグレードする方法です。 詳細については、「パッケージと依存関係を共有するパッケージ」を Microsoft.AspNetCore.App バージョンを参照することはできません

  • または を使用して別のプロジェクトへのプロジェクト参照が含まれている場合でも、 または を使用してパッケージのパッケージ参照をプロジェクト ファイルに追加する必要があるすべての Microsoft.AspNetCore.All Microsoft.AspNetCore.App Microsoft.AspNetCore.All プロジェクト Microsoft.AspNetCore.App

    例:

    • MyApp には へのパッケージ参照があります Microsoft.AspNetCore.App
    • MyApp.Tests には へのプロジェクト参照があります MyApp.csproj

    のパッケージ参照を に追加 Microsoft.AspNetCore.App します MyApp.Tests 。 詳細については、「統合テストは設定が難しく、共有フレームワークのサービスが壊 れる可能性があります」を参照してください

2.1 Docker イメージに更新する

ASP.NET Core 2.1 では、Docker イメージはdotnet/dotnet-docker リポジトリ にGitHubされました。 次の表は、Docker イメージとタグの変更を示しています。

2.0 2.1
microsoft/aspnetcore:2.0 microsoft/dotnet:2.1-aspnetcore-runtime
microsoft/aspnetcore-build:2.0 microsoft/dotnet:2.1-sdk

FROMDockerfile の行 を変更して、前の表の 2.1 列の新しいイメージ名とタグを使用します。 詳細については 、「aspnetcore docker repos から dotnet への移行」を参照してください

Main に対する変更

次の図は、テンプレートで生成された Program.cs ファイルに加えた変更を示しています。

古いバージョンの違い

上の図は、削除が赤の 2.0 バージョンを示しています。

次の図は、2.1 コードを示しています。 緑色のコードは、2.0 バージョンに置き換えました。

新しいバージョンの違い

次のコードは 、Program.cs の 2.1 バージョンを示しています。

namespace WebApp1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

新しい は Main 、 の呼び出しを BuildWebHost CreateWebHostBuilder に置き換える。 新しい統合テスト インフラストラクチャ をサポートするために IWebHostBuilder が追加されました

スタートアップに対する変更

次のコードは、2.1 テンプレートで生成されたコードへの変更を示しています。 すべての変更は、削除されている点を除き、新 UseBrowserLink しく追加されたコードです。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace WebApp1
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            // If the app uses Session or TempData based on Session:
            // app.UseSession();

            app.UseMvc();
        }
    }
}

前のコード変更の詳細については、以下を参照してください。

認証コードの変更

ASP.NET Core 2.1 は ASP.NET Core Identity 、クラス ライブラリ (RCL) Razor として提供されます。

既定の 2.1 UI では Identity 、現在、2.0 バージョンより重要な新機能は提供されません。 を Identity RCL パッケージに置き換えるのは省略可能です。 テンプレートで生成されたコードを RCL バージョンに置き換える利点は Identity 次のとおりです。

  • 多くのファイルがソース ツリーから移動されます。
  • に対するバグ修正または新機能は、メタパッケージ の Identity Microsoft.AspNetCore.App 含まれています。 が更新された場合は、 Identity 自動的 Microsoft.AspNetCore.App に更新されます。

テンプレートによって生成されたコードに対して簡単でない変更を行った Identity 場合:

  • 前の利点は、RCLバージョンへの変換を正当化していない可能性があります。
  • 2.0 ASP.NET Coreを保持できます。 Identity 完全にサポートされています。

Identity 2.1 は、 領域を持つエンドポイントを公開 Identity します。 たとえば、次の表は、 Identity 2.0 から2.1 に変更されるエンドポイントの例を示しています。

2.0 URL 2.1 URL
/Account/Login /Identity/Account/Login
/アカウント/ログアウト /Identity/アカウント/ログアウト
/アカウント/管理 /Identity/アカウント/管理

使用するコードがあり Identity 、2.0 UI を2.1 ライブラリに置き換えるアプリケーションは、 Identity Identity Identity uri の先頭にセグメントがあることを考慮する必要があり /Identity ます。 新しいエンドポイントを処理する方法の1つ Identity は、リダイレクトを設定することです。たとえば、から /Account/Login/Identity/Account/Login なります。

Identityバージョン2.1 に更新します。

2.1 に更新するには、次のオプションを使用でき Identity ます。

  • IdentityUI 2.0 コードを変更せずに使用します。 IdentityUI 2.0 コードの使用は完全にサポートされています。 生成されたコードに大幅な変更が加えられた場合は、この方法をお勧めし Identity ます。
  • 既存の Identity 2.0 コードと Identity スキャフォールディングをプロジェクトに削除します。 プロジェクトは ASP.NET Core Identity Razor クラスライブラリを使用します。 変更した ui コードのコードと UI を生成することができ Identity ます。 新しくスキャフォールディングた UI コードにコードの変更を適用します。
  • Identityすべてのファイルを上書き するオプションを使用して、既存の2.0 コードと Identity スキャフォールディングをプロジェクトに削除します。

Identity2.0 UI を Identity 2.1 Razor クラスライブラリに置き換える

このセクションでは、ASP.NET Core 2.0 テンプレートで生成された Identity コードを ASP.NET Core Identity Razor クラスライブラリに置き換える手順の概要を説明します。 次の手順は Razor ページプロジェクト用ですが、MVC プロジェクトのアプローチは似ています。

  • 2.1 バージョンを使用するようにプロジェクトファイルが更新されていることを確認する
  • 次のフォルダーとその中のすべてのファイルを削除します。
    • コントローラー
    • ページ/アカウント/
    • 拡張機能
  • プロジェクトをビルドします。
  • スキャフォールディング Identity プロジェクトには次のようになります。
    • _ レイアウトの cshtml ファイルを終了するプロジェクトを選択します。
    • **+**データコンテキストクラス の右側にあるアイコンを選択します。 既定の名前をそのまま使用します。
    • 新しいデータコンテキストクラスを作成するには、[ 追加 ] を選択します。 をスキャフォールディングにするには、新しいデータコンテキストを作成する必要があります。 次のセクションでは、新しいデータコンテキストを削除します。

スキャフォールディング後に更新 Identity

  • Identity IdentityDbContext Areas// Identity data/ フォルダー内の scaffolder によって生成された派生クラスを削除します。

  • Areas/ Identity / Identity HostingStartup を削除します。

  • _ Loginpartial. cshtml ファイルを更新します。

    • Pages/ _ loginpartialpages/Shared/ _ loginpartial に移動します。
    • asp-area="Identity"フォームとアンカーのリンクにを追加します。
    • <form />要素をに更新 <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right"> します。

    次のコードは、更新された _ loginpartial ファイルを示しています。

    @using Microsoft.AspNetCore.Identity
    
    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    
    @if (SignInManager.IsSignedIn(User))
    {
        <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
                </li>
                <li>
                    <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
                </li>
            </ul>
        </form>
    }
    else
    {
        <ul class="nav navbar-nav navbar-right">
            <li><a asp-area="Identity" asp-page="/Account/Register">Register</a></li>
            <li><a asp-area="Identity" asp-page="/Account/Login">Log in</a></li>
        </ul>
    }
    

次のコードを使用して ConfigureServices を更新します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<ApplicationUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Register no-op EmailSender used by account confirmation and password reset 
    // during development
    services.AddSingleton<IEmailSender, EmailSender>();
}

Razorページプロジェクトファイルの Razor 変更

レイアウトファイル

  • Pages/ _ layout. Cshtmlpages/Shared/ _ layout に移動する

  • Areas//[ Identity /]/ _ viewstart. cshtml で、 Layout = "/Pages/_Layout.cshtml" をに変更 Layout = "/Pages/Shared/_Layout.cshtml" します。

  • _ Layout ファイルには、次の変更点があります。

    • <partial name="_CookieConsentPartial" /> が追加されます。 詳細については、ASP.NET Core での GDPR のサポートに関するページを参照してください。
    • jQuery は2.2.0 から3.3.1 に変更されます。

_ValidationScriptsPartial. cshtml

  • ページ/ _ValidationScriptsPartial. cshtml は、 Pages/Shared/ _ validationscriptspartial. cshtml に移動します。
  • jquery . validate/1.14.0 への変更を検証/ 1.17.0 以降 します。

新しいファイル

次のファイルが追加されます。

  • Privacy.cshtml
  • Privacycshtml

上記のファイルの詳細については、 ASP.NET Core での GDPR のサポートに関する説明を参照してください。

MVC プロジェクトファイルの変更点 Razor

レイアウトファイル

Layout ファイルには、次の変更点があります。

  • <partial name="_CookieConsentPartial" /> が追加されます。
  • 3.3.1 の jQuery の変更

_ValidationScriptsPartial. cshtml

jquery. validate/ 1.14.0 への変更の検証/ 1.17.0 以降

新しいファイルとアクションメソッド

次のものが追加されます。

  • Views/ Home / Privacy cshtml
  • Privacyアクションメソッドがコントローラーに追加され Home ます。

上記のファイルの詳細については、 ASP.NET Core での GDPR のサポートに関する説明を参照してください。

ファイルの launchSettings.jsの変更

ASP.NET Core アプリが既定で HTTPS を使用するようになったため、ファイル のプロパティ/launchSettings.js が変更されました。

次の JSON は、ファイル に対して 以前の2.0 テンプレートで生成されたlaunchSettings.jsを示しています。

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:1799/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApp1": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:1798/"
    }
  }
}

次の JSON は、新しい2.1 テンプレートによって生成されるファイルの launchSettings.js を示しています。

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:39191",
      "sslPort": 44390
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "WebApp1": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

詳細については、クライアントで HTTPS を適用 ASP.NET Core を参照してください。

重大な変更

FileResult Range ヘッダー

FileResult では、既定では、 受け入れ範囲 ヘッダーが処理されなくなりました。 ヘッダーを有効にするには Accept-RangesEnableRangeProcessing をに設定 true します。

コントローラーのベースファイルと PhysicalFile 範囲ヘッダー

既定では、次のメソッドでは、 ControllerBase 受け入れ範囲 ヘッダーが処理されなくなりました。

ヘッダーを有効にするには、 Accept-Ranges EnableRangeProcessing パラメーターをに設定 true します。

追加の変更