Переход с ASP.NET Core 2.1 на 2.2

Автор: Скотт Адди (Scott Addie)

В этой статье объясняется, как обновить существующий проект ASP.NET Core 2.1 до ASP.NET Core 2.2.

Необходимые компоненты

Предупреждение

Если вы используете Visual Studio 2017, см. обсуждение dotnet/sdk issue #3124 для получения сведений о версиях пакета SDK для .NET Core, которые не работают с Visual Studio.

Обновление моникера целевой платформы (TFM)

Проекты, предназначенные для .NET Core, должны использовать TFM версии больше или равно .NET Core 2.2. В файле проекта обновите <TargetFramework> внутренний текст узла следующим netcoreapp2.2образом:

<TargetFramework>netcoreapp2.2</TargetFramework>

Проекты, предназначенные для платформа .NET Framework, могут продолжать использовать TFM версии больше или равно платформа .NET Framework 4.6.1:

<TargetFramework>net461</TargetFramework>

Внедрение модели размещения в процессе IIS

Чтобы внедрить модель размещения в процессе для IIS, добавьте <AspNetCoreHostingModel> свойство со значением InProcess<PropertyGroup> в файл проекта:

<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>

Модель размещения в процессе не поддерживается для ASP.NET основных приложений, предназначенных для платформа .NET Framework.

Дополнительные сведения см. в разделе Модуль ASP.NET Core для IIS.

Обновление пользовательского файла конфигурации web.config

Для проектов, использующих пользовательский файл web.config в корневом каталоге проекта, чтобы создать опубликованный файл web.config :

  • <handlers> В записи, которая добавляет модуль ядра ASP.NET (name="aspNetCore"), измените значение атрибута modules на AspNetCoreModuleAspNetCoreModuleV2.
  • В элементе <aspNetCore> добавьте атрибут модели размещения (hostingModel="InProcess").

Дополнительные сведения и примеры файлов web.config см. в разделе ASP.NET Core Module (ANCM) для IIS.

Обновление ссылок на пакеты

Если вы используете .NET Core, удалите атрибут ссылки Version на метапакет в файле проекта. Включение атрибута Version приводит к следующему предупреждению:

A PackageReference to 'Microsoft.AspNetCore.App' specified a Version of `2.2.0`. Specifying the version of this package is not recommended. For more information, see https://aka.ms/sdkimplicitrefs

Дополнительные сведения см. в разделе Microsoft.AspNetCore.App метапакет для ASP.NET Core.

Ссылка на метапакет должен выглядеть следующим <PackageReference /> узлом:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

Если вы используете платформа .NET Framework, обновите атрибут каждой ссылки Version на пакет до версии 2.2.0 или более поздней версии. Ниже приведены ссылки на пакеты в типичных проектах ASP.NET Core 2.2, предназначенных для платформа .NET Framework:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
  <PackageReference Include="Microsoft.AspNetCore.CookiePolicy" Version="2.2.0" />
  <PackageReference Include="Microsoft.AspNetCore.HttpsPolicy" Version="2.2.0" />
  <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
  <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
</ItemGroup>

При ссылке на Microsoft.AspNetCore.Razor. Проектируйте пакет, обновите его Version атрибут до версии 2.2.0 или более поздней версии. Сбой этого приводит к следующей ошибке:

Detected package downgrade: Microsoft.AspNetCore.Razor.Design from 2.2.0 to 2.1.2. Reference the package directly from the project to select a different version.

Обновление версии пакета SDK для .NET Core в global.json

Если решение использует global.json файл для целевой версии пакета SDK для .NET Core, обновите его version свойство до версии 2.2, установленной на компьютере:

{
  "sdk": {
    "version": "2.2.100"
  }
}

Обновление параметров запуска

При использовании Visual Studio Code обновите файл параметров запуска проекта (.vscode/launch.json). program Путь должен ссылаться на новый TFM:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.2/test-app.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart",
            "launchBrowser": {
                "enabled": true,
                "args": "${auto-detect-url}",
                "windows": {
                    "command": "cmd.exe",
                    "args": "/C start ${auto-detect-url}"
                },
                "osx": {
                    "command": "open"
                },
                "linux": {
                    "command": "xdg-open"
                }
            },
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            },
            "sourceFileMap": {
                "/Views": "${workspaceFolder}/Views"
            }
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

Обновление Kestrel конфигурации

Если приложение вызывается UseKestrel путем вызова CreateDefaultBuilder в методе Program CreateWebHostBuilder класса, вызовите ConfigureKestrel настройку Kestrel сервера вместо UseKestrel того, чтобы избежать конфликтов с моделью размещения в процессе IIS:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, options) =>
        {
            // Set properties and call methods on options
        });

Если приложение не вызывает CreateDefaultBuilder и создает узел вручную в Program классе, вызовитеUseKestrelперед вызовом:ConfigureKestrel

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseKestrel()
        .UseIISIntegration()
        .UseStartup<Startup>()
        .ConfigureKestrel((context, options) =>
        {
            // Set properties and call methods on options
        })
        .Build();

    host.Run();
}

Дополнительные сведения см Kestrel . на веб-сервере в ASP.NET Core.

Обновление версии совместимости

Обновите версию совместимости в Startup.ConfigureServicesVersion_2_2следующих версиях:

services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Обновление политики CORS

В ASP.NET Core 2.2 ПО промежуточного слоя CORS реагирует на дикий источник карта (*), если политика разрешает любой источник и разрешает учетные данные. Учетные данные не поддерживаются, если указан дикий источник карта (*), а браузеры запретят запрос CORS. Дополнительные сведения, включая варианты исправления проблемы на клиенте, см. в веб-документации MDN.

Чтобы устранить эту проблему на сервере, выполните одно из следующих действий:

  • Измените политику CORS, чтобы больше не разрешать учетные данные. То есть удалите вызов AllowCredentials при настройке политики.
  • Если учетные данные необходимы для успешного запроса CORS, измените политику, чтобы указать разрешенные узлы. Например, используйте builder.WithOrigins("https://api.example1.com", "https://example2.com") вместо использования AllowAnyOrigin.

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

В следующей таблице показаны изменения тега образа Docker:

2.1 2,2
microsoft/dotnet:2.1-aspnetcore-runtime mcr.microsoft.com/dotnet/core/aspnet:2.2
microsoft/dotnet:2.1-sdk mcr.microsoft.com/dotnet/core/sdk:2.2

Измените FROM строки в Dockerfile , чтобы использовать новые теги изображений в столбце 2.2 предыдущей таблицы.

Создание вручную в Visual Studio при использовании внутрипроцессного размещения СЛУЖБ IIS

Автоматическая сборка Visual Studio на основе интерфейса запроса браузера не работает с моделью размещения в процессе IIS. При использовании внутрипроцессного размещения необходимо вручную перестроить проект. Улучшения этого интерфейса планируется в будущем выпуске Visual Studio.

Обновление кода ведения журнала

Рекомендуемый код конфигурации ведения журнала не изменился с версии 2.1 до 2.2, но некоторые шаблоны программирования 1.x, которые по-прежнему работали в версии 2.1, больше не работают в 2.2.

Если приложение выполняет инициализацию, фильтрацию и загрузку Startup конфигурации в классе, переместите этот код в Program.Mainследующее:

  • Инициализация поставщика:

    Пример 1.x:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();
    }
    

    Пример 2.2.

    
    public static void Main(string[] args)
    {
        var webHost = new WebHostBuilder()
            // ...
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConsole();
            })
            // ...
    }
    
  • Фильтрация:

    Пример 1.x:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(LogLevel.Information);
        // or
        loggerFactory.AddConsole((category, level) => 
            category == "A" || level == LogLevel.Critical);
    }
    

    Пример 2.2.

    public static void Main(string[] args)
    {
        var webHost = new WebHostBuilder()
            // ...
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConsole()
                       .AddFilter<ConsoleLoggerProvider>
                           (category: null, level: LogLevel.Information)
                       // or
                       .AddFilter<ConsoleLoggerProvider>
                           ((category, level) => category == "A" ||
                               level == LogLevel.Critical)
                );
            })
            // ...
    }
    
  • Загрузка конфигурации:

    Пример 1.x:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration);
    }
    

    Пример 2.2.

    public static void Main(string[] args)
    {
        var webHost = new WebHostBuilder()
            // ...
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
            })
            // ...
    }
    

Дополнительные сведения см. в статье Ведение журнала в .NET Core и ASP.NET Core.

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

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

Дополнительные ресурсы