Миграция с 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 и не нужно устанавливать отдельно.
- 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.DotNet.Watcher.Tools (
- Необязательный: для элемента
Microsoft.VisualStudio.Web.CodeGeneration.Tools
DotNetCliToolReference> можно удалить <. Это средство можно заменить глобально установленной версией, выполнив команду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.
Известные проблемы для проектов, предназначенных для общей платформы:
Пакет SDK для .NET Core 2.1.300 (впервые включенный в Visual Studio 15.6) задает неявную версию
Microsoft.AspNetCore.App
2.1.0, которая вызвала конфликты с Entity Framework Core 2.1.1. Рекомендуется обновить пакет SDK для .NET Core до версии 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
. Дополнительные сведения см. в статье об тестировании интеграции, которую сложно настроить и может нарушить обслуживание общей платформы.
Обновление до образов 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.
Изменения, которые используют новые идиомы на основе кода, рекомендуемые в ASP.NET Core 2.1
Изменения в 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();
}
}
}
Предыдущие изменения кода подробно описаны в следующих разделах:
- Поддержка GDPR в ASP.NET Core и
CookiePolicyOptions
UseCookiePolicy
. - Http Strict Transport Security Protocol (HSTS) for
UseHsts
. - Требовать HTTPS для
UseHttpsRedirection
. - SetCompatibilityVersion для
SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.
Изменения в коде проверки подлинности
ASP.NET Core 2.1 предоставляет ASP.NET Core Identity в Razor качестве библиотеки классов (RCL).
Пользовательский интерфейс версии 2.1 Identity по умолчанию в настоящее время не предоставляет существенные новые возможности в версии 2.0. Identity Замена пакета RCL является необязательным. Преимущества замены созданного Identity шаблона на версию RCL:
- Многие файлы перемещаются из исходного дерева.
- Все исправления ошибок или новые функции, которые Identity будут включены в метапакет Microsoft.AspNetCore.App. При обновлении вы автоматически получите обновление Identity
Microsoft.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 в проект. Проект будет использовать библиотеку классов ASP.NET Core IdentityRazor . Вы можете создать код и пользовательский интерфейс для любого измененного кода пользовательского Identity интерфейса. Примените изменения кода к новому шаблонному коду пользовательского интерфейса.
- Удалите существующий Identity код 2.0 и шаблон Identity в проект с возможностью переопределения всех файлов.
Замените Identity пользовательский интерфейс 2.0 библиотекой Identity классов 2.1 Razor
В этом разделе описаны шаги по замене созданного шаблоном Identity кода ASP.NET Core 2.0 библиотекой классов ASP.NET Core Identity Razor. Следующие шаги предназначены для 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 имеет следующие изменения:
<partial name="_CookieConsentPartial" />
добавляется. Дополнительные сведения см. в разделе Поддержка общего регламента по защите данных в ASP.NET Core.- jQuery изменяется с 2.2.0 на 3.3.1.
_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 .
Изменения в файле launchSettings.json
Как ASP.NET приложения Core теперь используют HTTPS по умолчанию, Properties/launchSettings.json
файл изменился.
В следующем формате JSON показан созданный ранее файл шаблона launchSettings.json
2.0:
{
"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
заголовок, задайте значение true
EnableRangeProcessing .
Заголовок ControllerBase.File и PhysicalFile Range
Следующие ControllerBase методы больше не обрабатывают заголовок Accept-Ranges по умолчанию:
- Перегрузки ControllerBase.File
- ControllerBase.PhysicalFile
Чтобы включить Accept-Ranges
заголовок, задайте EnableRangeProcessing
для параметра значение true
.
модуль ASP.NET Core (ANCM)
Если модуль ASP.NET Core (ANCM) не был выбранным компонентом при установке Visual Studio или если в системе установлена предварительная версия ANCM, скачайте последнюю версию установщика пакета размещения .NET Core (прямая загрузка) и запустите установщик. Дополнительные сведения см. в разделе "Пакет размещения".
Дополнительные изменения
ASP.NET Core