Миграция с ASP.NET Core 2.0.x на 2.1

Автор: Рик Андерсон (Rick Anderson)

Дополнительные сведения о новых возможностях в ASP.NET Core 2.1 см. в ASP.NET Core 2.1.

В этой статье:

  • Основные сведения о переносе приложения ASP.NET Core 2.0 на 2.1.
  • Общие сведения об изменениях шаблонов веб-приложений ASP.NET Core.

Чтобы получить общие сведения об изменениях в версии 2.1, можно выполнить следующие действия.

  • Создайте веб-приложение ASP.NET Core 2.0 с именем WebApp1.
  • Зафиксируйте WebApp1 в системе управления версиями.
  • Удалите WebApp1 и создайте веб-приложение ASP.NET Core 2.1 с именем WebApp1 в том же месте.
  • Просмотрите изменения в версии 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. Дополнительные сведения см. в метапакете Microsoft.AspNetCore.All для ASP.NET Core 2.0 и метапакете Microsoft.AspNetCore.App для ASP.NET Core.
  • Удалите атрибут Version в ссылке на Microsoft.AspNetCore.Appпакет. Проекты, которые используются <Project Sdk="Microsoft.NET.Sdk.Web"> , не должны задавать версию. Версия подразумевается целевой платформой и выбрана для оптимального соответствия способу работы ASP.NET Core 2.1. Дополнительные сведения см. в разделе "Правила для проектов, предназначенных для общей платформы ".
  • Для приложений, предназначенных для платформа .NET Framework, обновите каждую ссылку на пакет до версии 2.1.
  • Удалите ссылки на <элементы DotNetCliToolReference> для следующих пакетов. Эти средства по умолчанию упаковываются в интерфейс командной строки .NET Core и не нужно устанавливать отдельно.
    • 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)
  • Необязательный: для элемента Microsoft.VisualStudio.Web.CodeGeneration.ToolsDotNetCliToolReference> можно удалить <. Это средство можно заменить глобально установленной версией, выполнив команду 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.

Известные проблемы для проектов, предназначенных для общей платформы:

Обновление до образов Docker 2.1

В 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

Измените FROM строки в Dockerfile , чтобы использовать новые имена и теги изображений в столбце 2.1 предыдущей таблицы. Дополнительные сведения см. в статье Миграция из репозиториев Docker aspnetcore в dotnet.

Изменения в Main

На следующих изображениях показаны изменения, внесенные в шаблонный созданный Program.cs файл.

old version differences

На предыдущем рисунке показана версия 2.0 с удалением красным цветом.

На следующем рисунке показан код 2.1. Код в зеленом цвете заменил версию 2.0:

new version differences

В следующем коде показана версия Program.cs2.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 заменяет вызов BuildWebHostCreateWebHostBuilderна . 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 в Razor качестве библиотеки классов (RCL).

Пользовательский интерфейс версии 2.1 Identity по умолчанию в настоящее время не предоставляет существенные новые возможности в версии 2.0. Identity Замена пакета RCL является необязательным. Преимущества замены созданного Identity шаблона на версию RCL:

  • Многие файлы перемещаются из исходного дерева.
  • Все исправления ошибок или новые функции, которые Identity будут включены в метапакет Microsoft.AspNetCore.App. При обновлении вы автоматически получите обновление IdentityMicrosoft.AspNetCore.App .

Если вы внесли нетривиальные изменения в созданный Identity шаблон кода:

  • Предыдущие преимущества, вероятно, не оправдывают преобразование в версию RCL.
  • Вы можете сохранить код ASP.NET Core 2.0 Identity , он полностью поддерживается.

Identity 2.1 предоставляет конечные точки с областью Identity . Например, в следующей таблице показаны примеры Identity конечных точек, которые изменяются с 2.0 до 2.1:

URL-адрес 2.0 URL-адрес 2.1
/Account/Login /Identity/Account/Login
/Account/Logout /Identity/Account/Logout
/Account/Manage /Identity/Account/Manage

Приложения с кодом, использующими Identity и заменяющие пользовательский интерфейс 2.0 Identity библиотекой 2.1 Identity , должны учитывать Identity URL-адреса /Identity сегментов, подготовленных к URI. Одним из способов обработки новых Identity конечных точек является настройка перенаправлений, например из /Account/Login ./Identity/Account/Login

Обновление Identity до версии 2.1

Следующие параметры доступны для обновления Identity до версии 2.1.

  • Используйте код пользовательского Identity интерфейса 2.0 без изменений. Использование Identity кода пользовательского интерфейса 2.0 полностью поддерживается. Это хороший подход, когда значительные изменения были внесены в созданный Identity код.
  • Удалите существующий Identity код 2.0 и шаблон Identity в проект. Проект будет использовать библиотеку основныхIdentityRazor классов ASP.NET. Вы можете создать код и пользовательский интерфейс для любого измененного кода пользовательского Identity интерфейса. Примените изменения кода к новому шаблонному коду пользовательского интерфейса.
  • Удалите существующий Identity код 2.0 и шаблон Identity в проект с возможностью переопределения всех файлов.

Замените Identity пользовательский интерфейс 2.0 библиотекой Identity классов 2.1 Razor

В этом разделе описаны шаги по замене шаблона ASP.NET Core 2.0, созданного кодом с помощью библиотеки основных классов ASP.NETIdentityRazor.Identity Следующие шаги предназначены для Razor проекта Pages, но подход к проекту MVC аналогичен.

  • Проверка обновления файла проекта для использования версий 2.1
  • Удалите следующие папки и все файлы в них:
    • Контроллеры
    • Страницы/ учетная запись/
    • Расширения
  • Выполните сборку проекта.
  • Identity Шаблон в проект:
    • Выберите проекты, выходя из файла _Layout.cshtml .
    • + Щелкните значок справа от класса контекста данных. Примите имя по умолчанию.
    • Нажмите кнопку "Добавить ", чтобы создать новый класс контекста данных. Создание нового контекста данных требуется для формирования шаблонов. Вы удалите новый контекст данных в следующем разделе.

Обновление после формирования шаблонов Identity

  • Удалите шаблон, созданный производным Identity классом в папке Areas//IdentityData/.IdentityDbContext

  • Удалите Areas/Identity/IdentityHostingStartup.cs.

  • Обновите файл _LoginPartial.cshtml:

    • Переместите pages/_LoginPartial.cshtml на Pages/Shared/_LoginPartial.cshtml.
    • Добавьте 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.cshtml :

    @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

Файл макета

  • Перемещение pages/_Layout.cshtml в Pages/Shared/_Layout.cshtml

  • В области/Pages/Identity_ViewStart.cshtml измените значение Layout = "/Pages/_Layout.cshtml"Layout = "/Pages/Shared/_Layout.cshtml"на .

  • Файл _Layout.cshtml имеет следующие изменения:

_ValidationScriptsPartial.cshtml

  • Pages/_ValidationScriptsPartial.cshtml перемещается на Pages/Shared/_ValidationScriptsPartial.cshtml.
  • jquery.validate/1.14.0 изменяется на jquery.validate/1.17.0.

Новые файлы

Добавлены следующие файлы:

  • Privacy.cshtml
  • Privacy.cshtml.cs

Сведения о предыдущих файлах см . в разделе поддержки GDPR в ASP.NET Core .

Изменения файлов проектов Razor MVC

Файл макета

Файл Layout.cshtml имеет следующие изменения:

  • <partial name="_CookieConsentPartial" /> добавляется.
  • jQuery изменяется с 2.2.0 на 3.3.1

_ValidationScriptsPartial.cshtml

jquery.validate/1.14.0 изменяется на jquery.validate/1.17.0

Новые файлы и методы действий

Добавлены следующие компоненты:

  • Views/Home/Privacy.cshtml
  • Метод Privacy действия добавляется в Home контроллер.

Сведения о предыдущих файлах см . в разделе поддержки GDPR в ASP.NET Core .

Изменения в файле launch Параметры.json

Как ASP.NET приложения Core теперь используют HTTPS по умолчанию, Properties/launchSettings.json файл изменился.

В следующем JSon показан файл, созданный ранее 2.0, сгенерированный launchSettings.json шаблоном:

{
  "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 показан новый созданный шаблоном launchSettings.json файл 2.1:

{
  "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.

Критические изменения

Заголовок диапазона FileResult

FileResult Больше не обрабатывает заголовок Accept-Ranges по умолчанию. Чтобы включить Accept-Ranges заголовок, задайте значение trueEnableRangeProcessing .

Заголовок ControllerBase.File и PhysicalFile Range

Следующие ControllerBase методы больше не обрабатывают заголовок Accept-Ranges по умолчанию:

Чтобы включить Accept-Ranges заголовок, задайте EnableRangeProcessing для параметра значение true.

модуль ASP.NET Core (ANCM)

Если модуль ASP.NET Core (ANCM) не был выбранным компонентом при установке Visual Studio или если в системе установлена предварительная версия ANCM, скачайте последнюю версию установщика пакета размещения .NET Core (прямая загрузка) и запустите установщик. Дополнительные сведения см. в разделе "Пакет размещения".

Дополнительные изменения