Миграция с ASP.NET Core 3,1 на 5,0Migrate from ASP.NET Core 3.1 to 5.0

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

В этой статье объясняется, как обновить существующий проект ASP.NET Core 3,1 до ASP.NET Core 5,0.This article explains how to update an existing ASP.NET Core 3.1 project to ASP.NET Core 5.0.

Предварительные требованияPrerequisites

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

Если вы полагаетесь на global.js файла для конкретной версии пакет SDK для .NET Core, обновите version свойство до установленной версии пакета SDK для .NET 5,0.If you rely upon a global.json file to target a specific .NET Core SDK version, update the version property to the .NET 5.0 SDK version that's installed. Пример:For example:

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

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

При обновлении Blazor WebAssembly проекта перейдите к разделу Обновление Blazor WebAssembly проектов .If updating a Blazor WebAssembly project, skip to the Update Blazor WebAssembly projects section. Для любого другого типа проекта ASP.NET Core обновите моникер целевой платформы файла проекта (TFM) net5.0 следующим образом:For any other ASP.NET Core project type, update the project file's Target Framework Moniker (TFM) to net5.0:

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

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

</Project>

Изменения в Blazor логике маршрутизации приложений в 5.0.1 и последующих версиях 5. x до 6,0Changes to Blazor app routing logic in 5.0.1 and further 5.x releases up to 6.0

Вычисление приоритета маршрута изменилось в ASP.NET Coreном выпуске исправления 5.0.1.The computation of route precedence changed in the ASP.NET Core 5.0.1 patch release. Это может повлиять на вас, если вы определили перехватывать все маршруты или маршруты с необязательными параметрами.This might affect you if you've defined catch-all routes or routes with optional parameters.

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

С предыдущим поведением в ASP.NET Core 5.0.0 или более ранней версии маршруты с более низким приоритетом, такие как, сопоставляются {*slug} перед маршрутами с более высоким приоритетом, например /customer/{id} .With the prior behavior in ASP.NET Core 5.0.0 or earlier, routes with lower precedence, such as {*slug}, are matched before routes with higher precedence, such as /customer/{id}.

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

Новое поведение в ASP.NET Core 5.0.1 или более поздней версии соответствует поведению маршрутизации, определенному в ASP.NET Core приложениях, где платформа рассчитывает и устанавливает приоритет маршрута для каждого сегмента, а также использует длину маршрута для прерывания связей в качестве вторичного критерия.The new behavior in ASP.NET Core 5.0.1 or later more closely matches the routing behavior defined in ASP.NET Core apps, where the framework computes and establishes the route precedence for each segment first and only uses the length of the route to break ties as a secondary criteria.

Причина измененияReason for change

Исходное поведение считается ошибкой в реализации, поскольку наша цель заключается в том, чтобы система маршрутизации находилась так Blazor же, как и система маршрутизации ASP.NET Core для подмножества функций, поддерживаемых Blazor маршрутизацией.The original behavior is considered a bug in the implementation because our goal is for the Blazor routing system to behave in the same way as the ASP.NET Core routing system for the subset of features supported by Blazor routing.

Добавьте PreferExactMatches атрибут к Router компоненту в файле, App.razor чтобы принять правильное поведение:Add the PreferExactMatches attribute to the Router component in the App.razor file to opt into the correct behavior:

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

Если PreferExactMatches имеет значение @true, то при сопоставлении маршрутов предпочтение отдается точным совпадениям, а не подстановочным знакам.When PreferExactMatches is set to @true, route matching prefers exact matches over wildcards.

Важно!

Все приложения должны явно задать PreferExactMatches значение @true .All apps should explicitly set PreferExactMatches to @true.

Возможность задать значение PreferExactMatches @false или оставить его неопределенным , предоставляется только для обеспечения обратной совместимости.The ability to set PreferExactMatches to @false or leave it unset is only provided for backward compatibility.

При выпуске .NET 6 маршрутизатор всегда будет предпочитать точные соответствия, и параметр будет PreferExactMatches недоступен.When .NET 6 is released, the router will always prefer exact matches, and the PreferExactMatches option won't be available.

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

Рекомендации в этом разделе относятся к Blazor моделям размещения. В разделах, следующих за этим разделом, приведены дополнительные рекомендации, относящиеся к размещению моделей и типов приложений. Примените рекомендации из всех соответствующих разделов к приложению.The guidance in this section applies to both Blazor hosting models. Sections following this section provide additional guidance specific to hosting models and app types. Apply the guidance from all relevant sections to your app.

  1. В wwwroot/index.html Blazor WebAssembly приложении или в Pages/_Host.cshtml Blazor Server приложении добавьте <link> элемент в <head> элемент для стилей.In wwwroot/index.html of a Blazor WebAssembly app or the Pages/_Host.cshtml of a Blazor Server app, add a <link> element to the <head> element for styles. В следующих <link> href значениях атрибута element заполнителем {ASSEMBLY NAME} является имя сборки приложения.In the following <link> element href attribute values, the placeholder {ASSEMBLY NAME} is the app's assembly name.

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

    Автономный Blazor WebAssembly или Blazor Server Пример:Standalone Blazor WebAssembly or Blazor Server example:

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

    Client Пример проекта размещенного Blazor WebAssembly решения:Client project of a hosted Blazor WebAssembly solution example:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Включите новое пространство имен в _Imports.razor файл приложения для виртуализации компонентов Microsoft.AspNetCore.Components.Web.Virtualization .Include a new namespace in the app's _Imports.razor file for component virtualization, Microsoft.AspNetCore.Components.Web.Virtualization. В следующих _Imports.razor файлах показаны пространства имен по умолчанию в приложениях, созданных из Blazor шаблонов проектов.The following _Imports.razor files show the default namespaces in apps generated from the Blazor project templates. Заполнитель {ASSEMBLY NAME} — это имя сборки приложения.The placeholder {ASSEMBLY NAME} is the app's assembly name.

    Blazor WebAssembly (_Imports.razor):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):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 :In the MainLayout component (Shared/MainLayout.razor), surround the component's HTML markup with a <div> element that has a class attribute set to page:

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

    MainLayout.razor.css: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: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.css файл Blazor WebAssembly приложения или wwwroot/css/site.css файла Blazor Server приложения содержит следующие стили.The latest base wwwroot/css/app.css file of a Blazor WebAssembly app or wwwroot/css/site.css file of a Blazor Server app includes the following styles. Удалите дополнительные стили, в которых находятся следующие стили и все, что вы добавили в приложение.Remove extra styles leaving the following styles and any that you've added to the app.

    Следующая таблица стилей содержит только базовые стили и не включает пользовательские стили, добавленные разработчиком:The following stylesheet only includes base styles and does not include custom styles added by the developer:

    @import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
    
    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;
    }
    

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

Следуйте указаниям в предыдущем разделе Обновление Blazor WebAssembly и Blazor Server проекты .Follow the guidance in the preceding Update Blazor WebAssembly and Blazor Server projects section.

Для Blazor WebAssembly проекта, включая Client проект размещенного Blazor решения, внесите в файл проекта следующие изменения:For a Blazor WebAssembly project, including the Client project of a hosted Blazor solution, apply the following changes to the project file:

  1. Обновите пакет SDK с Microsoft.NET.Sdk.Web на Microsoft.NET.Sdk.BlazorWebAssembly :Update the SDK from Microsoft.NET.Sdk.Web to Microsoft.NET.Sdk.BlazorWebAssembly:

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

    Примечание

    Это обновление применяется только к отдельным Blazor WebAssembly проектам и Client проектам размещенных Blazor решений.This update only applies to standalone Blazor WebAssembly projects and the Client projects of hosted Blazor solutions.

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

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

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Обновите другие пакеты до их последних версий.Update other packages to their latest versions. Последние версии можно найти по адресу NuGet.org.The latest versions can be found at NuGet.org.

  5. В службах wwwroot/index.html измените элемент, загружающий App компонент, на <div> элемент с id установленным значением app :In wwwroot/index.html, change the element that loads the App component to a <div> element with an id set to app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. В Program.Main ( Program.cs ) измените ссылку на <app> элемент на селектор CSS, добавив в # него хэш:In Program.Main (Program.cs), change the reference to the <app> element to a CSS selector by adding a hash # to it:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. В Program.Main ( Program.cs ) Измените временную регистрацию по умолчанию HttpClient на область, если она есть:In Program.Main (Program.cs), change a default transient HttpClient registration to scoped, if present:

    -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 решений:In Program.Main (Program.cs) of the Client app of hosted Blazor solutions:

    • Дополнительно можно заменить builder.HostEnvironment.BaseAddress базовыми адресами строкового клиента.Optionally, substitute builder.HostEnvironment.BaseAddress for string client base addresses.
    • Измените все именованные временные регистрации фабрики клиента на область.Change any named transient client factory registrations to scoped.
    -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} заполнитель является пространством имен приложения.In the preceding code, the {APP NAMESPACE} placeholder is the app's namespace.

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

Следуйте указаниям, приведенным в разделах, посвященных обновлению Blazor WebAssembly и Blazor Server проектам , и Обновление Blazor WebAssembly проектов .Follow the guidance in the preceding Update Blazor WebAssembly and Blazor Server projects and Update Blazor WebAssembly projects sections.

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования Azure Active Directory (AAD) для учетных записей Майкрософт:For a standalone Blazor WebAssembly app registered in the Azure portal to use Azure Active Directory (AAD) for Microsoft Accounts:

  • Для приложения требуются openid области и offline_access :The app requires the openid and offline_access scopes:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • В колонке портал Azure проверки подлинности регистрации приложений:In the Azure portal app registration Authentication blade:

    1. Удалите конфигурацию веб- платформы.Remove the Web platform configuration.
    2. Добавьте конфигурацию платформы одностраничного приложения с URI перенаправления приложения.Add a Single-page application platform configuration with the app's redirect URI.
    3. Отключите неявное предоставление для маркеров доступа и маркеров идентификации.Disable Implicit grant for Access tokens and ID tokens.

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

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

Следуйте указаниям, приведенным в разделах, посвященных обновлению Blazor WebAssembly и Blazor Server проектам , и Обновление Blazor WebAssembly проектов .Follow the guidance in the preceding Update Blazor WebAssembly and Blazor Server projects and Update Blazor WebAssembly projects sections.

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования Azure Active Directory (AAD):For a standalone Blazor WebAssembly app registered in the Azure portal to use Azure Active Directory (AAD):

  • Для приложения требуется https://graph.microsoft.com/User.Read область:The app requires the https://graph.microsoft.com/User.Read scope:

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

    1. Удалите конфигурацию веб- платформы.Remove the Web platform configuration.
    2. Добавьте конфигурацию платформы одностраничного приложения с URI перенаправления приложения.Add a Single-page application platform configuration with the app's redirect URI.
    3. Отключите неявное предоставление для маркеров доступа и маркеров идентификации.Disable Implicit grant for Access tokens and ID tokens.

Для получения дополнительной информации см. Защита изолированного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory.For more information, see Защита изолированного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory.

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

Следуйте указаниям, приведенным в разделах, посвященных обновлению Blazor WebAssembly и Blazor Server проектам , и Обновление Blazor WebAssembly проектов .Follow the guidance in the preceding Update Blazor WebAssembly and Blazor Server projects and Update Blazor WebAssembly projects sections.

Для автономного Blazor WebAssembly приложения, зарегистрированного в портал Azure для использования Azure Active Directory (AAD) B2C:For a standalone Blazor WebAssembly app registered in the Azure portal to use Azure Active Directory (AAD) B2C:

  • Для приложения требуются openid области и offline_access :The app requires the openid and offline_access scopes:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • В колонке портал Azure проверки подлинности регистрации приложений:In the Azure portal app registration Authentication blade:

    1. Удалите конфигурацию веб- платформы.Remove the Web platform configuration.
    2. Добавьте конфигурацию платформы одностраничного приложения с URI перенаправления приложения.Add a Single-page application platform configuration with the app's redirect URI.
    3. Отключите неявное предоставление для маркеров доступа и маркеров идентификации.Disable Implicit grant for Access tokens and ID tokens.

Для получения дополнительной информации см. Защита изолированного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory B2C.For more information, see Защита изолированного приложения ASP.NET Core Blazor WebAssembly с помощью Azure Active Directory B2C.

Размещенное Blazor WebAssembly приложение с Azure Active Directory (AAD) или AAD B2CHosted Blazor WebAssembly app with Azure Active Directory (AAD) or AAD B2C

Следуйте указаниям, приведенным в разделах, посвященных обновлению Blazor WebAssembly и Blazor Server проектам , и Обновление Blazor WebAssembly проектов .Follow the guidance in the preceding Update Blazor WebAssembly and Blazor Server projects and Update Blazor WebAssembly projects sections.

Client Регистрация приложения размещенного Blazor решения, использующего AAD или AAD B2C для проверки подлинности пользователей, должно использовать конфигурацию платформы приложений Azure с одной страницей .The Client app registration of a hosted Blazor solution that uses AAD or AAD B2C for user authentication should use a Single-page application Azure Apps platform configuration.

В Client колонке портал Azure проверки подлинности регистрации приложений:In the Azure portal Client app registration Authentication blade:

  1. Удалите конфигурацию веб- платформы.Remove the Web platform configuration.
  2. Добавьте конфигурацию платформы одностраничного приложения с URI перенаправления приложения.Add a Single-page application platform configuration with the app's redirect URI.
  3. Отключите неявное предоставление для маркеров доступа и маркеров идентификации.Disable Implicit grant for Access tokens and ID tokens.

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

Обновление серверного проекта размещенного Blazor решенияUpdate the Server project of a hosted Blazor solution

Следуйте указаниям в предыдущих разделах:Follow the guidance in the preceding sections:

Обновите Server проект размещенного Blazor решения как приложение ASP.NET Core, следуя общим рекомендациям в этой статье.Update the Server project of a hosted Blazor solution as an ASP.NET Core app following the general guidance in this article.

Кроме того, Server проекты, которые выполняют проверку подлинности пользователей в клиентских Blazor WebAssembly приложениях с помощью Azure Active Directory (AAD) или B2C, должны внедрять новые Identity пакеты Microsoft v 2.0:Additionally, Server projects that authenticate users to client Blazor WebAssembly apps with Azure Active Directory (AAD) or B2C should adopt new Microsoft Identity v2.0 packages:

Для AAD:For 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:For 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:For the preceding package references, determine the package versions for the {VERSION} placeholders at NuGet.org:

Примечание

Пакет SDK Server проекта в размещенном Blazor WebAssembly решении остается Microsoft.NET.Sdk.Web следующим образом:The SDK of the Server project in a hosted Blazor WebAssembly solution remains Microsoft.NET.Sdk.Web:

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

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

Очистка и перестроение решенияClean and rebuild the solution

После переноса приложения или решения в .NET 5 выполните очистку и перестроение приложения или решения.After migrating the app or solution to .NET 5, clean and rebuild the app or solution. Если между новыми ссылками на пакеты и кэшированными пакетами существуют несовместимости пакетов:If package incompatibilities exist between new package references and cached packages:

  1. Очистите кэши пакетов NuGet, выполнив следующую dotnet nuget locals команду в командной оболочке:Clear NuGet package caches by executing the following dotnet nuget locals command in a command shell:

    dotnet nuget locals --clear all
    
  2. Очистите и перестройте приложение или решение.Clean and rebuild the app or solution.

ДиагностикаTroubleshoot

Следуйте указаниям по устранению неполадок в конце Blazor WebAssembly раздела безопасности, относящегося к вашему приложению:Follow the Troubleshoot guidance at the end of the Blazor WebAssembly security topic that applies to your app:

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

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

Неавторизованный клиент для Azure Active Directory (AAD)Unauthorized client for Azure Active Directory (AAD)

После обновления Blazor WebAssembly приложения, использующего AAD для проверки подлинности, может появиться следующая ошибка при обратном вызове входа в приложение после того, как пользователь войдет с помощью AAD:After upgrading a Blazor WebAssembly app that uses AAD for authentication, you may receive the following error on the login callback to the app after the user signs in with AAD:

Сведения: Не удалось выполнить авторизацию Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2].info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization failed. Не выполнены такие требования: DenyAnonymousAuthorizationRequirement. Требуется пользователь, прошедший проверку подлинности.These requirements were not met: DenyAnonymousAuthorizationRequirement: Requires an authenticated user.

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

  • Ошибка unauthorized_client (У вызывающей стороны нет прав на запись для ресурса: [subscriptions/])Error: unauthorized_client
  • Описание: AADB2C90058: The provided application is not configured to allow public clients.Description: AADB2C90058: The provided application is not configured to allow public clients.

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

  1. На портале Azure перейдите к манифесту приложения.In the Azure portal, access the app's manifest.
  2. Задайте для атрибута allowPublicClient значение null или true.Set the allowPublicClient attribute to null or true.

Обновление Blazor последовательного веб-приложения (PWA)Update a Blazor Progressive Web Application (PWA)

Добавьте следующий элемент в файл проекта приложения PWA:Add the following item to the PWA app's project file:

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

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

Перенесите Razor библиотеки классов (рклс), чтобы воспользоваться преимуществами новых API-интерфейсов или функций, представленных в составе ASP.NET Core 5,0.Migrate Razor class libraries (RCLs) to take advantage of new APIs or features that are introduced as part of ASP.NET Core 5.0.

Обновление РКЛ, предназначенного для компонентов:To update a RCL that targets components:

  1. Обновите следующие свойства в файле проекта:Update the following properties in the project file:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Обновите другие пакеты до их последних версий.Update other packages to their latest versions. Последние версии можно найти по адресу NuGet.org.The latest versions can be found at NuGet.org.

Чтобы обновить РКЛ, предназначенный для MVC, обновите следующие свойства в файле проекта:To update an RCL targeting MVC, update the following properties in the project file:

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

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

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

В файле проекта обновите все файлы Microsoft. AspNetCore. *, Microsoft. EntityFrameworkCore. *, Microsoft. extensions. *и System.Net.Http.Jsв атрибуте ссылки на пакет Version значение 5.0.0 или более поздней версии.In the project file, update each Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*, and System.Net.Http.Json package reference's Version attribute to 5.0.0 or later. Пример:For example:

<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>

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

Для приложений, использующих DOCKER, обновите FROM инструкции и скрипты Dockerfile.For apps using Docker, update your Dockerfile FROM statements and scripts. Используйте базовый образ, включающий среду выполнения ASP.NET Core 5,0.Use a base image that includes the ASP.NET Core 5.0 runtime. Рассмотрим следующую docker pull команду в различиях между ASP.NET Core 3,1 и 5,0:Consider the following docker pull command difference between ASP.NET Core 3.1 and 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 .As part of the move to ".NET" as the product name, the Docker images moved from the mcr.microsoft.com/dotnet/core repositories to mcr.microsoft.com/dotnet. Дополнительные сведения см. в разделе DotNet/DotNet-DOCKER # 1939.For more information, see dotnet/dotnet-docker#1939.

Изменение привязки модели в ASP.NET Core MVC и Razor страницахModel binding changes in ASP.NET Core MVC and Razor Pages

Значения даты и времени привязаны к модели в формате UTCDateTime values are model bound as UTC times

В ASP.NET Core 3,1 и более ранних версиях DateTime значения были привязаны к модели как местное время, где часовой пояс был определен сервером.In ASP.NET Core 3.1 and earlier, DateTime values were model-bound as local time, where the timezone was determined by the server. DateTime значения, связанные с форматированием входных данных (JSON) и DateTimeOffset значениями, были привязаны как часовые пояса в формате UTC.DateTime values bound from input formatting (JSON) and DateTimeOffset values were bound as UTC timezones.

В ASP.NET Core 5,0 и более поздних версиях привязка модели согласованно привязывает DateTime значения к часовому поясу UTC.In ASP.NET Core 5.0 and later, model binding consistently binds DateTime values with the UTC timezone.

Чтобы удержать предыдущее поведение, удалите DateTimeModelBinderProvider в Startup.ConfigureServices :To retain the previous behavior, remove the DateTimeModelBinderProvider in Startup.ConfigureServices:

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

Комплексобжектмоделбиндерпровидер \ Комплексобжектмоделбиндер заменить Комплекстипемоделбиндерпровидер \ ComplexTypeModelBinderComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Чтобы добавить поддержку для типов записей привязки модели C# 9, ComplexTypeModelBinderProvider используется:To add support for model binding C# 9 record types, the ComplexTypeModelBinderProvider is:

  • Помечены как устаревшие.Annotated as obsolete.
  • Больше не регистрируется по умолчанию.No longer registered by default.

Приложения, зависящие от наличия ComplexTypeModelBinderProvider в ModelBinderProviders коллекции, должны ссылаться на новый поставщик подшивки:Apps that rely on the presence of the ComplexTypeModelBinderProvider in the ModelBinderProviders collection need to reference the new binder provider:

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

Уседатабасиррорпаже устарелUseDatabaseErrorPage obsolete

Шаблоны ASP.NET Core 3,1, которые включают параметр для отдельных учетных записей пользователей, формируют вызов UseDatabaseErrorPage .The ASP.NET Core 3.1 templates that include an option for individual user accounts generate a call to UseDatabaseErrorPage. UseDatabaseErrorPage теперь является устаревшим и должен быть заменен сочетанием AddDatabaseDeveloperPageExceptionFilter и UseMigrationsEndPoint , как показано в следующем коде:UseDatabaseErrorPage is now obsolete and should be replaced with a combination of AddDatabaseDeveloperPageExceptionFilter and UseMigrationsEndPoint, as shown in the following code:

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.For more information, see this GitHub issue.

Проверка критических измененийReview breaking changes

Критические изменения с .NET Core 3,1 на .NET 5,0 см. в разделе критические изменения для миграции с версии 3,1 на 5,0.For breaking changes from .NET Core 3.1 to .NET 5.0, see Breaking changes for migration from version 3.1 to 5.0. ASP.NET Core и Entity Framework Core также включены в список.ASP.NET Core and Entity Framework Core are also included in the list.