Переход с ASP.NET Core 3.1 на 5.0

В этой статье объясняется, как обновить существующий проект ASP.NET Core 3.1 до ASP.NET Core 5.0. Инструкции по миграции с ASP.NET Core 3.1 на ASP.NET Core 6.0 см. в разделе "Миграция с ASP.NET Core 3.1 на 6.0".

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

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

Если вы используете global.json файл для конкретной версии пакета SDK для .NET Core, обновите version свойство до установленной версии пакета SDK для .NET 5.0. Например:

{
  "sdk": {
-    "version": "3.1.200"
+    "version": "5.0.100"
  }
}

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

При обновлении Blazor WebAssembly проекта перейдите к разделу "Обновить Blazor WebAssembly проекты ". Для любого другого типа проекта ASP.NET Core обновите moniker целевой платформы проекта (TFM) файл проекта следующим net5.0образом:

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

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

Удаление bin и obj папки

Возможно, потребуется удалить bin папки и obj папки. Выполните команду dotnet nuget locals --clear all , чтобы очистить кэш пакетов NuGet.

Blazor Изменения логики маршрутизации приложений в выпусках 5.0.1 и более 5.x до 6.0

Вычисление приоритета маршрута изменилось в выпуске исправлений ASP.NET Core 5.0.1. Это может повлиять на вас, если вы определили маршруты catch-all или маршруты с необязательными параметрами.

Старое поведение

При предыдущем поведении в ASP.NET Core 5.0.0 или более ранней версии маршруты с более низким приоритетом, например, сопоставляются перед маршрутами с более высоким приоритетом, например{*slug}/customer/{id}.

Новое поведение

Новое поведение в ASP.NET Core 5.0.1 или более поздней версии тесно соответствует поведению маршрутизации, определенному в приложениях ASP.NET Core, где платформа вычисляет и устанавливает приоритет маршрута для каждого сегмента в первую очередь и использует только длину маршрута для разрыва связей в качестве дополнительных критериев.

Причина изменения

Исходное поведение считается ошибкой в реализации, так как наша цель заключается Blazor в том, чтобы система маршрутизации работала так же, как и система маршрутизации ASP.NET Core для подмножества функций, поддерживаемых Blazor маршрутизацией.

PreferExactMatches Добавьте атрибут в Router компонент в App.razor файле, чтобы выбрать правильное поведение:

<Router AppAssembly="@typeof(Program).Assembly" PreferExactMatches="@true">

Если PreferExactMatches имеет значение @true, то при сопоставлении маршрутов предпочтение отдается точным совпадениям, а не подстановочным знакам.

Важно!

Все приложения должны явно задать значение PreferExactMatches@true.

Возможность установить PreferExactMatches@false или оставить ее неустановленной предоставляется только для обратной совместимости.

При выпуске .NET 6 маршрутизатор всегда предпочитает точные совпадения, и PreferExactMatches параметр не будет доступен.

Обновление Blazor WebAssembly и Blazor Server проекты

Рекомендации, приведенные в этом разделе, относятся к обеим Blazor моделям размещения. В разделах ниже этого раздела приведены дополнительные рекомендации, относящиеся к моделям размещения и типам приложений. Примените инструкции из всех соответствующих разделов к приложению.

  1. Blazor WebAssembly В wwwroot/index.html приложении или Pages/_Host.cshtmlBlazor Server приложении добавьте <link> элемент в <head> элемент для стилей. В следующих <link> значениях атрибутов элемента href заполнитель {ASSEMBLY NAME} — это имя сборки приложения.

    +<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet" />
    

    Автономный Blazor WebAssembly или Blazor Server пример:

    +<link href="BlazorSample.styles.css" rel="stylesheet" />
    

    Client проект размещенного Blazor WebAssembly решения:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Включите новое пространство имен в файл приложения _Imports.razor для виртуализации компонентов. Microsoft.AspNetCore.Components.Web.Virtualization В следующих _Imports.razor файлах показаны пространства имен по умолчанию в приложениях, созданных на основе Blazor шаблонов проектов. Заполнитель {ASSEMBLY NAME} — это имя сборки приложения.

    Blazor WebAssembly (_Imports.razor):

    @using System.Net.Http
    @using System.Net.Http.Json
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.AspNetCore.Components.WebAssembly.Http
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    

    Blazor Server (_Imports.razor):

    @using System.Net.Http
    @using Microsoft.AspNetCore.Authorization
    @using Microsoft.AspNetCore.Components.Authorization
    @using Microsoft.AspNetCore.Components.Forms
    @using Microsoft.AspNetCore.Components.Routing
    @using Microsoft.AspNetCore.Components.Web
    @using Microsoft.AspNetCore.Components.Web.Virtualization
    @using Microsoft.JSInterop
    @using {ASSEMBLY NAME}
    @using {ASSEMBLY NAME}.Shared
    
  3. MainLayout В компоненте (Shared/MainLayout.razor) окружите разметку HTML компонента элементом <div> с атрибутом, заданным class для pageследующих элементов:

    <div class="page">
    
        ...
    
    </div>
    
  4. Добавьте в папку Shared следующие файлы:

    MainLayout.razor.css:

    .page {
        position: relative;
        display: flex;
        flex-direction: column;
    }
    
    .main {
        flex: 1;
    }
    
    .sidebar {
        background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
    }
    
    .top-row {
        background-color: #f7f7f7;
        border-bottom: 1px solid #d6d5d5;
        justify-content: flex-end;
        height: 3.5rem;
        display: flex;
        align-items: center;
    }
    
        .top-row ::deep a, .top-row .btn-link {
            white-space: nowrap;
            margin-left: 1.5rem;
        }
    
        .top-row a:first-child {
            overflow: hidden;
            text-overflow: ellipsis;
        }
    
    @media (max-width: 767.98px) {
        .top-row:not(.auth) {
            display: none;
        }
    
        .top-row.auth {
            justify-content: space-between;
        }
    
        .top-row a, .top-row .btn-link {
            margin-left: 0;
        }
    }
    
    @media (min-width: 768px) {
        .page {
            flex-direction: row;
        }
    
        .sidebar {
            width: 250px;
            height: 100vh;
            position: sticky;
            top: 0;
        }
    
        .top-row {
            position: sticky;
            top: 0;
            z-index: 1;
        }
    
        .main > div {
            padding-left: 2rem !important;
            padding-right: 1.5rem !important;
        }
    }
    

    NavMenu.razor.css:

    .navbar-toggler {
        background-color: rgba(255, 255, 255, 0.1);
    }
    
    .top-row {
        height: 3.5rem;
        background-color: rgba(0,0,0,0.4);
    }
    
    .navbar-brand {
        font-size: 1.1rem;
    }
    
    .oi {
        width: 2rem;
        font-size: 1.1rem;
        vertical-align: text-top;
        top: -2px;
    }
    
    .nav-item {
        font-size: 0.9rem;
        padding-bottom: 0.5rem;
    }
    
        .nav-item:first-of-type {
            padding-top: 1rem;
        }
    
        .nav-item:last-of-type {
            padding-bottom: 1rem;
        }
    
        .nav-item ::deep a {
            color: #d7d7d7;
            border-radius: 4px;
            height: 3rem;
            display: flex;
            align-items: center;
            line-height: 3rem;
        }
    
    .nav-item ::deep a.active {
        background-color: rgba(255,255,255,0.25);
        color: white;
    }
    
    .nav-item ::deep a:hover {
        background-color: rgba(255,255,255,0.1);
        color: white;
    }
    
    @media (min-width: 768px) {
        .navbar-toggler {
            display: none;
        }
    
        .collapse {
            /* Never collapse the sidebar for wide screens */
            display: block;
        }
    }
    
  5. Последний базовый wwwroot/css/app.cssBlazor WebAssembly файл приложения или wwwroot/css/site.css файла Blazor Server приложения включает следующие стили. Удалите дополнительные стили, оставляя следующие стили и все, что вы добавили в приложение.

    Следующая таблица стилей включает только базовые стили и не включает пользовательские стили, добавленные разработчиком:

    html, body {
        font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    }
    
    a, .btn-link {
        color: #0366d6;
    }
    
    .btn-primary {
        color: #fff;
        background-color: #1b6ec2;
        border-color: #1861ac;
    }
    
    .content {
        padding-top: 1.1rem;
    }
    
    .valid.modified:not([type=checkbox]) {
        outline: 1px solid #26b050;
    }
    
    .invalid {
        outline: 1px solid red;
    }
    
    .validation-message {
        color: red;
    }
    
    #blazor-error-ui {
        background: lightyellow;
        bottom: 0;
        box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
        display: none;
        left: 0;
        padding: 0.6rem 1.25rem 0.7rem 1.25rem;
        position: fixed;
        width: 100%;
        z-index: 1000;
    }
    
    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
    

    Примечание.

    В приведенном выше примере директива @import для значков Open Iconic (open-iconic-bootstrap.css), предоставляемых шаблоном Blazor проекта, не отображается. Открытый знак был заброшен своими обслуживателями.

Обновление проектов Blazor WebAssembly

Следуйте указаниям, приведенным в предыдущем разделе "Обновление Blazor WebAssembly и Blazor Server проекты ".

Blazor WebAssembly Для проекта, включая Client проект размещенного Blazor решения, примените следующие изменения к файлу проекта:

  1. Обновление пакета SDK до Microsoft.NET.Sdk.WebMicrosoft.NET.Sdk.BlazorWebAssembly:

    - <Project Sdk="Microsoft.NET.Sdk.Web">
    + <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    

    Примечание.

    Это обновление применяется только к автономным Blazor WebAssembly проектам и Client проектам размещенных Blazor решений.

  2. Обновите следующие свойства:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Удалите ссылку на пакет microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Обновите другие пакеты до последних версий. Последние версии можно найти на NuGet.org.

  5. В wwwroot/index.htmlполе <><div>/> измените элемент, который загружает App компонент в элемент с набором idapp:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. В Program.Main (Program.cs) измените ссылку на <app> элемент на селектор CSS, добавив хэш # в него:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. В Program.Main (Program.cs) измените временную HttpClient регистрацию по умолчанию на область d, если она присутствует:

    -builder.Services.AddTransient(sp => new HttpClient 
    -    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    +builder.Services.AddScoped(sp => new HttpClient 
    +    { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
    
  8. В Program.Main (Program.cs) Client приложения размещенных Blazor решений:

    • При необходимости замените builder.HostEnvironment.BaseAddress строковые базовые адреса клиента.
    • Измените все именованные временные регистрации фабрики клиентов на область d.
    -builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    -    client => client.BaseAddress = new Uri("https://localhost:5001"))
    -    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    -builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>()
    -    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    +builder.Services.AddHttpClient("{APP NAMESPACE}.ServerAPI", 
    +    client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    +    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
    +builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    +    .CreateClient("{APP NAMESPACE}.ServerAPI"));
    

    В приведенном выше коде {APP NAMESPACE} заполнитель — это пространство имен приложения.

Автономное Blazor WebAssembly приложение с учетными записями Майкрософт

Следуйте инструкциям, приведенным в предыдущих разделах "Обновление Blazor WebAssembly и проекты" и Blazor Server"Обновить Blazor WebAssembly проекты".

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования идентификатора Microsoft Entra (ME-ID) для учетных записей Майкрософт:

  • Приложению openid требуются область offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • В колонке проверки подлинности регистрации приложения портал Azure:

    1. Удалите конфигурацию веб-платформы .
    2. Добавьте конфигурацию платформы одностраничных приложений с URI перенаправления приложения.
    3. Отключите неявное предоставление маркеров доступа и маркеров идентификатора.

Дополнительные сведения см. в статье "Защита автономного приложения ASP.NET Core Blazor WebAssembly с помощью учетных записей Майкрософт".

Автономное Blazor WebAssembly приложение с идентификатором Microsoft Entra (ME-ID)

Следуйте инструкциям, приведенным в предыдущих разделах "Обновление Blazor WebAssembly и проекты" и Blazor Server"Обновить Blazor WebAssembly проекты".

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования идентификатора Microsoft Entra (ME-ID):

  • Приложению https://graph.microsoft.com/User.Read требуется область:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • В колонке проверки подлинности регистрации приложения портал Azure:

    1. Удалите конфигурацию веб-платформы .
    2. Добавьте конфигурацию платформы одностраничных приложений с URI перенаправления приложения.
    3. Отключите неявное предоставление маркеров доступа и маркеров идентификатора.

Дополнительные сведения см. в статье "Защита автономного приложения ASP.NET Core Blazor WebAssembly с помощью идентификатора Microsoft Entra.

Автономное Blazor WebAssembly приложение с Azure Active Directory (AAD) B2C

Следуйте инструкциям, приведенным в предыдущих разделах "Обновление Blazor WebAssembly и проекты" и Blazor Server"Обновить Blazor WebAssembly проекты".

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования Azure Active Directory (AAD) B2C:

  • Приложению openid требуются область offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • В колонке проверки подлинности регистрации приложения портал Azure:

    1. Удалите конфигурацию веб-платформы .
    2. Добавьте конфигурацию платформы одностраничных приложений с URI перенаправления приложения.
    3. Отключите неявное предоставление маркеров доступа и маркеров идентификатора.

Дополнительные сведения см. в статье "Защита автономного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory B2C".

Размещенное Blazor WebAssembly приложение с идентификатором Microsoft Entra (ME-ID) или AAD B2C

Следуйте инструкциям, приведенным в предыдущих разделах "Обновление Blazor WebAssembly и проекты" и Blazor Server"Обновить Blazor WebAssembly проекты".

Регистрация Client размещенного Blazor решения, использующего AAD или AAD B2C для проверки подлинности пользователей, должна использовать конфигурацию платформы приложение Azure одностраничных приложений.

В колонке проверки подлинности регистрации приложения портал AzureClient:

  1. Удалите конфигурацию веб-платформы .
  2. Добавьте конфигурацию платформы одностраничных приложений с URI перенаправления приложения.
  3. Отключите неявное предоставление маркеров доступа и маркеров идентификатора.

Дополнительные сведения см. в разделе:

Обновление проекта сервера размещенного Blazor решения

Следуйте инструкциям в предыдущих разделах:

Server Обновите проект размещенного Blazor решения в качестве приложения ASP.NET Core, следуя общим рекомендациям в этой статье.

Кроме того, проекты, Server которые проходят проверку подлинности пользователей в клиентских Blazor WebAssembly приложениях с помощью идентификатора Microsoft Entra (ME-ID) или B2C, должны принимать новые пакеты Microsoft Identity версии 2.0:

Для AAD:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

Для AAD B2C:

-<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="..." />
+<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
+<PackageReference Include="Microsoft.Identity.Web.UI" Version="{VERSION}" />

Для предыдущих ссылок на пакет определите версии пакетов для {VERSION} заполнителей на NuGet.org:

Примечание.

Пакет SDK Server проекта в размещенном Blazor WebAssembly решении остается Microsoft.NET.Sdk.Webследующим:

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

Дополнительные сведения см. в разделе:

Очистка и перестроение решения

После переноса приложения или решения в .NET 5 очистите и перестроите приложение или решение. Если несовместимость пакета существует между новыми ссылками на пакеты и кэшируемыми пакетами:

  1. Снимите кэши пакетов NuGet, выполнив следующую dotnet nuget locals команду в командной оболочке:

    dotnet nuget locals --clear all
    
  2. Очистка и перестроение приложения или решения.

Устранить неполадки

Следуйте инструкциям по устранению неполадок в конце Blazor WebAssembly раздела безопасности, который применяется к приложению:

Автономные приложения Blazor WebAssembly:

Размещенные приложения Blazor WebAssembly:

Несанкционированный клиент для идентификатора Microsoft Entra (ME-ID)

После обновления Blazor WebAssembly приложения, использующего AAD для проверки подлинности, вы можете получить следующую ошибку при обратном вызове входа в приложение после входа пользователя в AAD:

info: сбой авторизации Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]. Эти требования не выполнены: DenyAnonymousAuthorizationRequirement: требуется прошедший проверку подлинности пользователь.

Ошибка обратного вызова входа от AAD:

  • Ошибка: unauthorized_client
  • Описание: AADB2C90058: The provided application is not configured to allow public clients.

Чтобы устранить эту ошибку, сделайте следующее:

  1. На портале Azure перейдите к манифесту приложения.
  2. Задайте для атрибута allowPublicClient значение null или true.

Обновление прогрессивного Blazor веб-приложения (PWA)

Добавьте следующий элемент в файл проекта приложения PWA:

<ItemGroup>
  <ServiceWorker Include="wwwroot\service-worker.js" 
    PublishedContent="wwwroot\service-worker.published.js" />
</ItemGroup>

Если проект wwwroot/index.html содержитBlazor WebAssemblyBlazor ServerPages/_Host.cshtml элемент таблицы <link> стилей для scoped.styles.css предыдущего выпуска версии 5.0, удалите <link> тег:

-<link href="_framework/scoped.styles.css/" rel="stylesheet" />

Обновление Razor библиотек классов (RCLs)

Перенос Razor библиотек классов (RCLs) для использования новых API или функций, представленных в рамках ASP.NET Core 5.0.

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

  1. Обновите следующие свойства в файле проекта:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Обновите другие пакеты до последних версий. Последние версии можно найти на NuGet.org.

Чтобы обновить RCL для MVC, обновите следующие свойства в файле проекта:

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

  <PropertyGroup>
-    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <TargetFramework>net5.0</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>

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

В файле проекта обновите каждый атрибут пакета Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*и справочник по Version пакету System.Net.Http.Json до 5.0.0 или более поздней версии. Например:

<ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="3.1.6" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.6">
-    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.1.6" />
-    <PackageReference Include="System.Net.Http.Json" Version="3.2.1" />
+    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
+    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0" />
+    <PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
</ItemGroup>

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

Для приложений с помощью Docker обновите инструкции и скрипты DockerfileFROM . Используйте базовый образ, включающий среду выполнения ASP.NET Core 5.0. Рассмотрим следующее docker pull различие между ASP.NET Core 3.1 и 5.0:

- docker pull mcr.microsoft.com/dotnet/core/aspnet:3.1
+ docker pull mcr.microsoft.com/dotnet/aspnet:5.0

В рамках перехода на .NET в качестве имени продукта образы Docker перемещаются из mcr.microsoft.com/dotnet/core репозиториев mcr.microsoft.com/dotnetв . Дополнительные сведения см. в разделе dotnet/dotnet-docker#1939.

Изменения привязки модели в ASP.NET Core MVC и Razor Pages

Значения DateTime привязаны к модели в формате UTC

В ASP.NET Core 3.1 и более ранних DateTime версий значения были привязаны к модели как локальное время, где часовой пояс был определен сервером. DateTime значения, привязанные к входным форматированию (JSON) и DateTimeOffset значениям, были привязаны к часовой поясам UTC.

В ASP.NET Core 5.0 и более поздних версий привязка модели последовательно связывает DateTime значения с часовым поясом UTC.

Чтобы сохранить предыдущее поведение, удалите в DateTimeModelBinderProviderStartup.ConfigureServices:

services.AddControllersWithViews(options => 
    options.ModelBinderProviders.RemoveType<DateTimeModelBinderProvider>());

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder замените ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Чтобы добавить поддержку типов записей C# 9 для привязки модели, этоComplexTypeModelBinderProvider:

  • Аннотированный как устаревший.
  • Больше не зарегистрировано по умолчанию.

Приложения, использующие наличие ComplexTypeModelBinderProvider в ModelBinderProviders коллекции, должны ссылаться на новый поставщик привязки:

- var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexTypeModelBinderProvider>();
+ var complexModelBinderProvider = options.ModelBinderProviders.OfType<ComplexObjectModelBinderProvider>();

UseDatabaseErrorPage устарел

Шаблоны ASP.NET Core 3.1, которые включают параметр для отдельных учетных записей пользователей, создают вызов UseDatabaseErrorPage. UseDatabaseErrorPage теперь устарело и должно быть заменено сочетанием AddDatabaseDeveloperPageExceptionFilter и UseMigrationsEndPoint, как показано в следующем коде:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
+   services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
+       app.UseMigrationsEndPoint();
-       app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

Дополнительные сведения см. здесь на GitHub.

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

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

Изменения ссылок на пакеты, затрагивающие некоторые пакеты NuGet

При миграции некоторых Microsoft.Extensions.* пакетов NuGet из репозитория dotnet/extensions в dotnet/runtime, как описано в разделе "Перенос содержимого dotnet/extensions в dotnet/runtime и dotnet/aspnetcore"(aspnet/Announcements #411), изменения упаковки применяются к некоторым перенесенным пакетам. Эти изменения часто приводят к изменениям пространства имен для API .NET.

Для дальнейшего изучения API для изменения пространства имен приложений при миграции на 5.0 используйте браузер API .NET.

Миграция Microsoft.Identity. Веб

На следующих вики-страницах объясняется, как перенести Microsoft.Identity. Веб-сайт от ASP.NET Core 3.1 до 5.0:

В следующих руководствах также описана миграция:

Просмотр критических изменений

Критические изменения из .NET Core 3.1 в .NET 5.0 см. в разделе "Критические изменения" для миграции с версии 3.1 на 5.0. ASP.NET Core и Entity Framework Core также включены в список.