Migrowanie z ASP.NET Core 3.1 do wersji 5.0

W tym artykule wyjaśniono, jak zaktualizować istniejący projekt ASP.NET Core 3.1 w celu ASP.NET Core 5.0. Aby uzyskać instrukcje dotyczące migracji z ASP.NET Core 3.1 do ASP.NET Core 6.0, zobacz Migrowanie z ASP.NET Core 3.1 do 6.0.

Wymagania wstępne

Aktualizowanie wersji zestawu .NET Core SDK w programie global.json

Jeśli plik jest zależny od global.json określonej wersji zestawu .NET Core SDK, zaktualizuj version właściwość do zainstalowanej wersji zestawu .NET 5.0 SDK. Przykład:

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

Aktualizowanie platformy docelowej

W przypadku aktualizowania Blazor WebAssembly projektu przejdź do sekcji Aktualizowanie Blazor WebAssembly projektów . W przypadku dowolnego innego typu projektu ASP.NET Core zaktualizuj plik projektu Target Framework Moniker (TFM) na net5.0:

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

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

</Project>

Usuwanie bin i obj foldery

Może być konieczne usunięcie bin folderów i obj . Uruchom polecenie dotnet nuget locals --clear all , aby wyczyścić pamięć podręczną pakietu NuGet.

Blazor Zmiany logiki routingu aplikacji w wersji 5.0.1 i kolejnych wersjach 5.x do 6.0

Obliczenie pierwszeństwa trasy zmieniło się w wersji poprawkowej ASP.NET Core 5.0.1. Może to mieć wpływ na użytkownika, jeśli zdefiniowano trasy lub trasy typu catch-all z opcjonalnymi parametrami.

Stare zachowanie

W przypadku wcześniejszego zachowania w programie ASP.NET Core 5.0.0 lub starszym trasy o niższym pierwszeństwie, takie jak , są dopasowywane przed trasami o wyższym prioryencie, takim jak {*slug}/customer/{id}.

Nowe zachowanie

Nowe zachowanie w programie ASP.NET Core 5.0.1 lub nowszym ściślej odpowiada zachowaniu routingu zdefiniowanemu w aplikacjach ASP.NET Core, w którym struktura oblicza i ustanawia pierwszeństwo trasy dla każdego segmentu jako pierwszy i używa tylko długości trasy do zerwania więzi jako kryteriów pomocniczych.

Przyczyna wprowadzenia zmiany

Oryginalne zachowanie jest uznawane za usterkę w implementacji, ponieważ naszym celem jest Blazor zachowanie systemu routingu w taki sam sposób, jak system routingu ASP.NET Core dla podzestawu funkcji obsługiwanych przez Blazor routing.

PreferExactMatches Dodaj atrybut do Router składnika w pliku, App.razor aby wybrać prawidłowe zachowanie:

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

Gdy PreferExactMatches jest ustawiona wartość @true, dopasowanie tras preferuje dokładne dopasowania dla symboli wieloznacznych.

Ważne

Wszystkie aplikacje powinny jawnie ustawić wartość PreferExactMatches@true.

Możliwość ustawienia PreferExactMatches wartości lub @false pozostawienia jej bez ustawienia jest dostępna tylko w celu zapewnienia zgodności z poprzednimi wersjami.

Po wydaniu platformy .NET 6 router zawsze będzie preferował dokładne dopasowania, a PreferExactMatches opcja nie będzie dostępna.

Aktualizowanie Blazor WebAssembly i Blazor Server projekty

Wskazówki zawarte w tej sekcji dotyczą obu Blazor modeli hostingu. Sekcje opisane w tej sekcji zawierają dodatkowe wskazówki dotyczące hostowania modeli i typów aplikacji. Zastosuj wskazówki ze wszystkich odpowiednich sekcji do aplikacji.

  1. Blazor WebAssembly W wwwroot/index.html aplikacji lub Blazor ServerPages/_Host.cshtml aplikacji dodaj <link> element do <head> elementu style. W następujących <link> wartościach atrybutów elementu href symbol zastępczy {ASSEMBLY NAME} jest nazwą zestawu aplikacji.

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

    Blazor WebAssembly Autonomiczny lub Blazor Server przykład:

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

    Client przykład projektu hostowanego Blazor WebAssembly rozwiązania:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Dołącz nową przestrzeń nazw do pliku aplikacji _Imports.razor na potrzeby wirtualizacji składników. Microsoft.AspNetCore.Components.Web.Virtualization Poniższe _Imports.razor pliki pokazują domyślne przestrzenie nazw w aplikacjach wygenerowanych na Blazor podstawie szablonów projektów. Symbol zastępczy {ASSEMBLY NAME} to nazwa zestawu aplikacji.

    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. W składniku MainLayout (Shared/MainLayout.razor) umieść znacznik HTML składnika za pomocą <div> elementu, który ma class atrybut ustawiony na :page

    <div class="page">
    
        ...
    
    </div>
    
  4. Dodaj następujące pliki do Shared folderu:

    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. Najnowszy plik Blazor WebAssembly podstawowy wwwroot/css/app.css aplikacji lub wwwroot/css/site.css pliku Blazor Server aplikacji zawiera następujące style. Usuń dodatkowe style, pozostawiając następujące style i wszystkie dodane do aplikacji.

    Poniższy arkusz stylów zawiera tylko style podstawowe i nie zawiera niestandardowych stylów dodanych przez dewelopera:

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

    Uwaga

    W poprzednim przykładzie nie jest wyświetlana @import dyrektywa dotycząca ikon Open Iconic (open-iconic-bootstrap.css) udostępnionych Blazor przez szablon projektu. Open Iconic został porzucony przez jego opiekunów.

Aktualizowanie Blazor WebAssembly projektów

Postępuj zgodnie ze wskazówkami w poprzedniej sekcji Update and projects (Aktualizacja Blazor WebAssembly i Blazor Server projekty ).

Blazor WebAssembly W przypadku projektu, w tym Client projektu hostowanego Blazor rozwiązania, zastosuj następujące zmiany w pliku projektu:

  1. Zaktualizuj zestaw SDK z Microsoft.NET.Sdk.Web do :Microsoft.NET.Sdk.BlazorWebAssembly

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

    Uwaga

    Ta aktualizacja dotyczy tylko projektów autonomicznych Blazor WebAssembly i Client projektów hostowanych Blazor rozwiązań.

  2. Zaktualizuj następujące właściwości:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Usuń odwołanie do pakietu Microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Zaktualizuj inne pakiety do najnowszych wersji. Najnowsze wersje można znaleźć w NuGet.org.

  5. W wwwroot/index.htmlpliku zmień element, który ładuje App składnik do <div> elementu z id zestawem na app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. W Program.Main pliku (Program.cs) zmień odwołanie do <app> elementu na selektor CSS, dodając do niego skrót # :

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. W Program.Main (Program.cs) zmień domyślną rejestrację przejściową HttpClient na zakres, jeśli istnieje:

    -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. W Program.Main (Program.cs) aplikacji Client hostowanych Blazor rozwiązań:

    • Opcjonalnie zastąp ciąg builder.HostEnvironment.BaseAddress adresami podstawowymi klienta.
    • Zmień wszystkie nazwane przejściowe rejestracje fabryki klienta na zakres.
    -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"));
    

    W poprzednim kodzie {APP NAMESPACE} symbol zastępczy jest przestrzenią nazw aplikacji.

Aplikacja autonomiczna Blazor WebAssembly z kontami Microsoft

Postępuj zgodnie ze wskazówkami w poprzednich sekcjach Update and projects (Aktualizowanie Blazor WebAssembly projektów) i Blazor ServerUpdate projects (Aktualizowanie Blazor WebAssembly projektów).

W przypadku aplikacji autonomicznej Blazor WebAssembly zarejestrowanej w witrynie Azure Portal do używania identyfikatora Microsoft Entra ID (ME-ID) dla kont Microsoft:

  • Aplikacja wymaga openid zakresów i offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • W bloku Uwierzytelnianie rejestracji aplikacji w witrynie Azure Portal:

    1. Usuń konfigurację platformy sieci Web .
    2. Dodaj konfigurację platformy aplikacji jednostronicowej przy użyciu identyfikatora URI przekierowania aplikacji.
    3. Wyłącz niejawne udzielanie tokenów dostępu i tokenów identyfikatorów.

Aby uzyskać więcej informacji, zobacz Zabezpieczanie autonomicznej aplikacji ASP.NET Core Blazor WebAssembly przy użyciu kont Microsoft.

Autonomiczna Blazor WebAssembly aplikacja z identyfikatorem Entra firmy Microsoft (ME-ID)

Postępuj zgodnie ze wskazówkami w poprzednich sekcjach Update and projects (Aktualizowanie Blazor WebAssembly projektów) i Blazor ServerUpdate projects (Aktualizowanie Blazor WebAssembly projektów).

W przypadku aplikacji autonomicznej Blazor WebAssembly zarejestrowanej w witrynie Azure Portal do korzystania z identyfikatora Entra firmy Microsoft (ME-ID):

  • Aplikacja wymaga https://graph.microsoft.com/User.Read zakresu:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • W bloku Uwierzytelnianie rejestracji aplikacji w witrynie Azure Portal:

    1. Usuń konfigurację platformy sieci Web .
    2. Dodaj konfigurację platformy aplikacji jednostronicowej przy użyciu identyfikatora URI przekierowania aplikacji.
    3. Wyłącz niejawne udzielanie tokenów dostępu i tokenów identyfikatorów.

Aby uzyskać więcej informacji, zobacz Secure an ASP.NET Core standalone app with Microsoft Entra ID (Zabezpieczanie autonomicznej aplikacji ASP.NET Core Blazor WebAssembly przy użyciu identyfikatora Entra firmy Microsoft).

Aplikacja autonomiczna Blazor WebAssembly z usługą Azure Active Directory (AAD) B2C

Postępuj zgodnie ze wskazówkami w poprzednich sekcjach Update and projects (Aktualizowanie Blazor WebAssembly projektów) i Blazor ServerUpdate projects (Aktualizowanie Blazor WebAssembly projektów).

W przypadku aplikacji autonomicznej Blazor WebAssembly zarejestrowanej w witrynie Azure Portal do korzystania z usługi Azure Active Directory (AAD) B2C:

  • Aplikacja wymaga openid zakresów i offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • W bloku Uwierzytelnianie rejestracji aplikacji w witrynie Azure Portal:

    1. Usuń konfigurację platformy sieci Web .
    2. Dodaj konfigurację platformy aplikacji jednostronicowej przy użyciu identyfikatora URI przekierowania aplikacji.
    3. Wyłącz niejawne udzielanie tokenów dostępu i tokenów identyfikatorów.

Aby uzyskać więcej informacji, zobacz Secure an ASP.NET Core standalone app with Azure Active Directory B2C (Zabezpieczanie autonomicznej aplikacji ASP.NET Core Blazor WebAssembly za pomocą usługi Azure Active Directory B2C).

Hostowana Blazor WebAssembly aplikacja z identyfikatorem Entra firmy Microsoft (ME-ID) lub usługą AAD B2C

Postępuj zgodnie ze wskazówkami w poprzednich sekcjach Update and projects (Aktualizowanie Blazor WebAssembly projektów) i Blazor ServerUpdate projects (Aktualizowanie Blazor WebAssembly projektów).

Rejestracja Client aplikacji hostowanego Blazor rozwiązania korzystającego z usługi AAD lub AAD B2C na potrzeby uwierzytelniania użytkowników powinna używać konfiguracji platformy aplikacja systemu Azure s jednostronicowej aplikacji.

W bloku Uwierzytelnianie rejestracji aplikacji w witrynie Azure PortalClient:

  1. Usuń konfigurację platformy sieci Web .
  2. Dodaj konfigurację platformy aplikacji jednostronicowej przy użyciu identyfikatora URI przekierowania aplikacji.
  3. Wyłącz niejawne udzielanie tokenów dostępu i tokenów identyfikatorów.

Aby uzyskać więcej informacji, zobacz:

Aktualizowanie projektu serwera hostowanego Blazor rozwiązania

Postępuj zgodnie ze wskazówkami w poprzednich sekcjach:

Server Zaktualizuj projekt hostowanego Blazor rozwiązania jako aplikację ASP.NET Core, postępując zgodnie z ogólnymi wskazówkami w tym artykule.

Ponadto projekty, Server które uwierzytelniają użytkowników w aplikacjach klienckich Blazor WebAssembly przy użyciu identyfikatora Microsoft Entra ID (ME-ID) lub B2C, powinny przyjąć nowe pakiety firmy Microsoft Identity w wersji 2.0:

W przypadku usługi AAD:

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

W przypadku usługi 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}" />

W przypadku poprzednich odwołań do pakietu określ wersje pakietów dla {VERSION} symboli zastępczych w NuGet.org:

Uwaga

Zestaw SDK projektu w rozwiązaniu Server hostowanym Blazor WebAssembly pozostaje:Microsoft.NET.Sdk.Web

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

Aby uzyskać więcej informacji, zobacz:

Czyszczenie i ponowne kompilowanie rozwiązania

Po przeprowadzeniu migracji aplikacji lub rozwiązania do platformy .NET 5 wyczyść i ponownie skompiluj aplikację lub rozwiązanie. Jeśli istnieją niezgodności pakietów między nowymi odwołaniami do pakietu i buforowanymi pakietami:

  1. Wyczyść pamięci podręczne pakietów NuGet, wykonując następujące dotnet nuget locals polecenie w powłoce poleceń:

    dotnet nuget locals --clear all
    
  2. Wyczyść i ponownie skompiluj aplikację lub rozwiązanie.

Rozwiązywanie problemów

Postępuj zgodnie ze wskazówkami dotyczącymi rozwiązywania problemów na końcu tematu Blazor WebAssembly zabezpieczeń, który ma zastosowanie do aplikacji:

Autonomiczne aplikacje zestawu Blazor WebAssembly:

Hostowane aplikacje zestawu Blazor WebAssembly:

Nieautoryzowany klient dla identyfikatora Entra firmy Microsoft (ME-ID)

Po uaktualnieniu aplikacji korzystającej Blazor WebAssembly z usługi AAD do uwierzytelniania może zostać wyświetlony następujący błąd podczas wywołania zwrotnego logowania do aplikacji po zalogowaniu się użytkownika za pomocą usługi AAD:

info: Autoryzacja Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] nie powiodła się. Te wymagania nie zostały spełnione: DenyAnonymousAuthorizationRequirement: Wymaga uwierzytelnionego użytkownika.

Błąd wywołania zwrotnego logowania z usługi AAD:

  • Błąd: unauthorized_client
  • Opis: AADB2C90058: The provided application is not configured to allow public clients.

Aby naprawić ten błąd:

  1. W witrynie Azure Portal uzyskaj dostęp do manifestu aplikacji.
  2. allowPublicClient Ustaw atrybut na null lub true.

Aktualizowanie progresywnej Blazor aplikacji internetowej (PWA)

Dodaj następujący element do pliku projektu aplikacji PWA:

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

Jeśli projekt wwwroot/index.html (Blazor WebAssembly) lub Pages/_Host.cshtml (Blazor Server) zawiera element arkusza <link> stylów z scoped.styles.css wcześniejszej wersji zapoznawczej 5.0, usuń <link> tag:

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

Aktualizowanie Razor bibliotek klas (RCLS)

Migrowanie Razor bibliotek klas (RCLs) w celu korzystania z nowych interfejsów API lub funkcji, które są wprowadzane w ramach ASP.NET Core 5.0.

Aby zaktualizować listę RCL, która jest przeznaczona dla składników:

  1. Zaktualizuj następujące właściwości w pliku projektu:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Zaktualizuj inne pakiety do najnowszych wersji. Najnowsze wersje można znaleźć w NuGet.org.

Aby zaktualizować listę RCL docelową MVC, zaktualizuj następujące właściwości w pliku projektu:

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

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

Aktualizowanie odwołań do pakietów

W pliku projektu zaktualizuj atrybut odwołania pakietu Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*i Atrybut pakietu System.Net.Http.Json do atrybutu Version 5.0.0.0 lub nowszego. Przykład:

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

Aktualizowanie obrazów platformy Docker

W przypadku aplikacji korzystających z platformy Docker zaktualizuj instrukcje i skrypty dockerfileFROM . Użyj obrazu podstawowego, który zawiera środowisko uruchomieniowe ASP.NET Core 5.0. Rozważ następującą docker pull różnicę poleceń między ASP.NET Core 3.1 i 5.0:

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

W ramach przenoszenia do platformy ".NET" jako nazwy produktu obrazy platformy Docker zostały przeniesione z mcr.microsoft.com/dotnet/core repozytoriów do .mcr.microsoft.com/dotnet Aby uzyskać więcej informacji, zobacz dotnet/dotnet-docker#1939.

Zmiany powiązań modelu w usługach ASP.NET Core MVC i Razor Pages

Wartości daty/godziny są powiązane z modelem zgodnie z godzinami UTC

W ASP.NET Core 3.1 i starszych DateTime wartości były powiązane z modelem jako czas lokalny, gdzie strefa czasowa została określona przez serwer. DateTime wartości powiązane z formatowaniem wejściowym (JSON) i DateTimeOffset wartości były powiązane jako strefy czasowe UTC.

W ASP.NET Core 5.0 lub nowszym powiązanie modelu stale wiąże DateTime wartości ze strefą czasową UTC.

Aby zachować poprzednie zachowanie, usuń element w pliku DateTimeModelBinderProvider :Startup.ConfigureServices

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder zastąp ciąg ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Aby dodać obsługę powiązań modelu dla typów rekordów języka C# 9, to ComplexTypeModelBinderProvider :

  • Oznaczone jako przestarzałe.
  • Nie zarejestrowano już domyślnie.

Aplikacje, które opierają się na obecności ComplexTypeModelBinderProvider elementu w ModelBinderProviders kolekcji, muszą odwoływać się do nowego dostawcy binder:

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

Przestarzałe useDatabaseErrorPage

Szablony ASP.NET Core 3.1 zawierające opcję dla poszczególnych kont użytkowników generują wywołanie metody UseDatabaseErrorPage. UseDatabaseErrorPage element jest teraz przestarzały i powinien zostać zastąpiony AddDatabaseDeveloperPageExceptionFilter kombinacją elementów i UseMigrationsEndPoint, jak pokazano w poniższym kodzie:

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();
    }

Aby uzyskać więcej informacji, zobacz ten problem w serwisie GitHub.

ASP.NET Core Module (ANCM)

Jeśli moduł ASP.NET Core Module (ANCM) nie był wybranym składnikiem, gdy program Visual Studio został zainstalowany lub czy wcześniejsza wersja narzędzia ANCM została zainstalowana w systemie, pobierz najnowszy Instalator pakietu hostingowego platformy .NET Core (pobieranie bezpośrednie) i uruchom instalatora. Aby uzyskać więcej informacji, zobacz Hosting Bundle (Pakiet hostingu).

Zmiany odwołania do pakietu wpływające na niektóre pakiety NuGet

Podczas migracji niektórych Microsoft.Extensions.* pakietów NuGet z repozytorium dotnet/extensions do dotnet/runtime zgodnie z opisem w temacie Migrowanie zawartości dotnet/extensions do dotnet/runtime i dotnet/aspnet/aspnetcore (aspnet/Anonss #411) zmiany pakietów są stosowane do niektórych migrowanych pakietów. Te zmiany często powodują zmiany przestrzeni nazw dla interfejsu API platformy .NET.

Aby dokładniej zbadać interfejsy API pod kątem zmian przestrzeni nazw aplikacji podczas migracji do wersji 5.0, użyj przeglądarki interfejsu API platformy .NET.

Migrowanie microsoft.Identity. Sieci web

Na poniższych stronach wiki wyjaśniono, jak przeprowadzić migrację rozwiązania Microsoft.Identity. Sieć Web z ASP.NET Core 3.1 do 5.0:

W poniższych samouczkach wyjaśniono również migrację:

Przeglądanie zmian powodujących niezgodność

Aby uzyskać zmiany powodujące niezgodność z platformy .NET Core 3.1 do .NET 5.0, zobacz Istotne zmiany migracji z wersji 3.1 do 5.0. Na liście znajdują się również ASP.NET Core i Entity Framework Core.