Migrieren von ASP.NET Core 3.1 zu 5.0

In diesem Artikel wird erläutert, wie Sie ein vorhandenes ASP.NET Core 3.1-Projekt auf ASP.NET Core 5.0 aktualisieren. Anweisungen zum Migrieren von ASP.NET Core 3.1 zu ASP.NET Core 6.0 finden Sie unter "Migrieren von ASP.NET Core 3.1 zu 6.0".

Voraussetzungen

Aktualisieren der .NET Core SDK-Version in „global.json“

Wenn Sie auf eine global.json-Datei angewiesen sind, um auf eine bestimmte .NET Core SDK-Version zu abzielen, aktualisieren Sie die version Eigenschaft auf die installierte .NET 5.0 SDK-Version. Zum Beispiel:

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

Aktualisieren des Zielframeworks

Wenn Sie ein Blazor WebAssembly Projekt aktualisieren, wechseln Sie zum Abschnitt "Projekte aktualisierenBlazor WebAssembly". Aktualisieren Sie für einen anderen ASP.NET Core Projekttyp die Zielframework-Datei (TFM) der Projektdatei auf net5.0:

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

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

</Project>

Löschen bin und obj Ordner

Möglicherweise müssen Sie die bin Ordner löschen obj . Führen Sie die Ausführung dotnet nuget locals --clear all aus, um den NuGet-Paketcache zu löschen.

Änderungen an Blazor der App-Routinglogik in 5.0.1 und weitere 5.x-Versionen bis zu 6.0

Die Berechnung der Route-Priorität wurde in der ASP.NET Core 5.0.1-Patchversion geändert. Dies kann sich auf Sie auswirken, wenn Sie alle fangende Routen oder Routen mit optionalen Parametern definiert haben.

Altes Verhalten

Mit dem vorherigen Verhalten in ASP.NET Core 5.0.0 oder früher werden Routen mit niedrigerer Rangfolge, z. B. , vor Routen mit höherer Rangfolge /customer/{id}übereinstimmen, z{*slug}. B. .

Neues Verhalten

Das neue Verhalten in ASP.NET Core 5.0.1 oder höher entspricht dem in ASP.NET Core Apps definierten Routingverhalten, bei dem das Framework die Routenvorfolge für jedes Segment zuerst berechnet und erstellt und nur die Länge der Route verwendet, um Bindungen als sekundäre Kriterien zu unterbrechen.

Grund für die Änderung

Das ursprüngliche Verhalten gilt als Fehler in der Implementierung, da unser Ziel dafür ist, dass sich das Routingsystem auf dieselbe Weise verhält wie das ASP.NET Core Routingsystem für die Blazor Teilmenge von Features, die durch Blazor Routing unterstützt werden.

Fügen Sie dem Element in der RouterApp.razor Datei das Attribut hinzu, um das PreferExactMatches richtige Verhalten zu aktivieren:

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

Wenn PreferExactMatches auf @true festgelegt ist, bevorzugt die Routenzuordnung exakte Übereinstimmungen gegenüber Platzhaltern.

Wichtig

Alle Apps sollten explizit auf @truefestgelegt PreferExactMatches werden.

Die Möglichkeit zum Festlegen PreferExactMatches@false oder Verlassen des Unet-Objekts wird nur für die Abwärtskompatibilität bereitgestellt.

Wenn .NET 6 veröffentlicht wird, bevorzugt der Router immer genaue Übereinstimmungen, und die PreferExactMatches Option ist nicht verfügbar.

Aktualisieren Blazor WebAssembly und Blazor Server Projekte

Die Anleitungen in diesem Abschnitt gelten für beide Blazor Hostingmodelle. Abschnitte, die in diesem Abschnitt folgen, bieten zusätzliche Anleitungen für Hostingmodelle und App-Typen. Wenden Sie die Anleitungen aus allen relevanten Abschnitten auf Ihre App an.

  1. wwwroot/index.html Fügen Sie in einer Blazor ServerBlazor WebAssembly App oder Pages/_Host.cshtml einer <head> App ein <link> Element zum Element für Formatvorlagen hinzu. Im folgenden <link> Elementattributewerte href ist der Platzhalter {ASSEMBLY NAME} der Assemblyname der App.

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

    Eigenständiges Blazor WebAssembly oder Blazor Server Beispiel:

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

    Client Projekt einer gehosteten Blazor WebAssembly Lösung:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Fügen Sie einen neuen Namespace in die Datei der App _Imports.razor für die Komponentenvirtualisierung ein. Microsoft.AspNetCore.Components.Web.Virtualization Die folgenden _Imports.razor Dateien zeigen die Standardnamespaces in Apps an, die aus den Blazor Projektvorlagen generiert wurden. Der Platzhalter {ASSEMBLY NAME} ist der Assemblyname der App.

    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. Geben Sie in der Komponente (Shared/MainLayout.razor) das HTML-Markup der MainLayout Komponente mit einem Element ein, das über ein <div>class Attribut festgelegt pageist:

    <div class="page">
    
        ...
    
    </div>
    
  4. Fügen Sie dem Shared Ordner die folgenden Dateien hinzu:

    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. Die neueste Basisdatei wwwroot/css/app.css einer Blazor WebAssembly App oder wwwroot/css/site.css Datei einer Blazor Server App enthält die folgenden Formatvorlagen. Entfernen Sie zusätzliche Formatvorlagen, die die folgenden Formatvorlagen verlassen und alle, die Sie der App hinzugefügt haben.

    Das folgende Stylesheet enthält nur Basisformatvorlagen und enthält keine benutzerdefinierten Formatvorlagen, die vom Entwickler hinzugefügt werden:

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

Aktualisieren von Blazor WebAssembly Projekten

Folgen Sie den Anleitungen im vorherigen Abschnitt "Update Blazor WebAssembly " und Blazor Server "Projekte" .

Wenden Sie für ein Blazor WebAssembly Projekt, einschließlich des Client Projekts einer gehosteten Blazor Lösung, die folgenden Änderungen an der Projektdatei an:

  1. Aktualisieren des SDK von Microsoft.NET.Sdk.Web zu Microsoft.NET.Sdk.BlazorWebAssembly:

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

    Hinweis

    Dieses Update gilt nur für eigenständige Blazor WebAssembly Projekte und die Client Projekte von gehosteten Blazor Lösungen.

  2. Aktualisieren Sie die folgenden Eigenschaften:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Entfernen Sie den Paketverweis auf Microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Aktualisieren Sie andere Pakete auf ihre neuesten Versionen. Die neuesten Versionen finden Sie unter NuGet.org.

  5. wwwroot/index.htmlÄndern Sie in , das Element, das die App Komponente in ein Element lädt, mit einem <div>id Satz auf app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Ändern Program.Main Sie in (Program.cs) den Verweis auf das <app> Element auf einen CSS-Auswahlgeber, indem Sie einen Hash # hinzufügen:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Ändern Sie in Program.Main (Program.cs), ändern Sie eine standardmäßige vorübergehende HttpClient Registrierung, wenn vorhanden:

    -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. In Program.Main (Program.cs) der Client App von gehosteten Blazor Lösungen:

    • Ersetzen Sie builder.HostEnvironment.BaseAddress optional die Zeichenfolgenbasisadressen.
    • Ändern Sie alle benannten vorübergehenden Clientfabrikregistrierungen in den Bereich.
    -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"));
    

    Im vorherigen Code ist der {APP NAMESPACE} Platzhalter der App-Namespace.

Eigenständige Blazor WebAssembly App mit Microsoft-Konten

Folgen Sie den Anleitungen in den vorherigen Abschnitten "UpdateBlazor WebAssembly" und "Projekte aktualisierenBlazor Server".Blazor WebAssembly

Für eine eigenständige Blazor WebAssembly App, die in der Azure-Portal registriert ist, um Azure Active Directory (AAD) für Microsoft-Konten zu verwenden:

  • Die App erfordert die und offline_access die openid Bereiche:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Im Blatt Azure-Portal App-Registrierungsauthentifizierung:

    1. Entfernen Sie die Webplattformkonfiguration .
    2. Fügen Sie eine Plattformkonfiguration mit der Umleitungs-URI der App hinzu.
    3. Deaktivieren Sie implizite Gewährung für Zugriffstoken und ID-Token.

Weitere Informationen finden Sie unter Sichern einer eigenständigen ASP.NET Core Blazor WebAssembly App mit Microsoft-Konten.

Eigenständige Blazor WebAssembly App mit Azure Active Directory (AAD)

Folgen Sie den Anleitungen in den vorherigen Abschnitten "UpdateBlazor WebAssembly" und "Projekte aktualisierenBlazor Server".Blazor WebAssembly

Für eine eigenständige Blazor WebAssembly App, die im Azure-Portal registriert ist, um Azure Active Directory (AAD) zu verwenden):

  • Die App erfordert den https://graph.microsoft.com/User.Read Umfang:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Im Blatt Azure-Portal App-Registrierungsauthentifizierung:

    1. Entfernen Sie die Webplattformkonfiguration .
    2. Fügen Sie eine Plattformkonfiguration mit der Umleitungs-URI der App hinzu.
    3. Deaktivieren Sie implizite Gewährung für Zugriffstoken und ID-Token.

Weitere Informationen finden Sie unter Secure an ASP.NET Core Blazor WebAssembly eigenständige App mit Azure Active Directory.

Eigenständige Blazor WebAssembly App mit Azure Active Directory (AAD) B2C

Folgen Sie den Anleitungen in den vorherigen Abschnitten "UpdateBlazor WebAssembly" und "Projekte aktualisierenBlazor Server".Blazor WebAssembly

Für eine eigenständige Blazor WebAssembly App, die in der Azure-Portal registriert ist, um Azure Active Directory (AAD) B2C zu verwenden:

  • Die App erfordert die und offline_access die openid Bereiche:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Im Blatt Azure-Portal App-Registrierungsauthentifizierung:

    1. Entfernen Sie die Webplattformkonfiguration .
    2. Fügen Sie eine Konfiguration der Anwendungsplattform mit der Umleitungs-URI der App hinzu.
    3. Deaktivieren Sie die implizite Erteilung für Zugriffstoken und ID-Token.

Weitere Informationen finden Sie unter Sichern einer ASP.NET Core Blazor WebAssembly eigenständigen App mit Azure Active Directory B2C.

Gehostete Blazor WebAssembly App mit Azure Active Directory (AAD) oder AAD B2C

Folgen Sie den Anweisungen in den vorherigen Abschnitten "UpdateBlazor WebAssembly" und Blazor Server "Projekte aktualisierenBlazor WebAssembly".

Die ClientApp-Registrierung einer gehosteten Blazor Lösung, die AAD oder AAD B2C für die Benutzerauthentifizierung verwendet, sollte eine Konfiguration der Azure Apps-Plattform auf einer Seite verwenden.

Im Blatt Azure-Portal ClientApp-Registrierungsauthentifizierung:

  1. Entfernen Sie die Webplattformkonfiguration .
  2. Fügen Sie eine Konfiguration der Anwendungsplattform mit der Umleitungs-URI der App hinzu.
  3. Deaktivieren Sie die implizite Erteilung für Zugriffstoken und ID-Token.

Weitere Informationen finden Sie unter

Aktualisieren des Serverprojekts einer gehosteten Blazor Lösung

Folgen Sie den Anweisungen in den vorherigen Abschnitten:

Aktualisieren Sie das Server Projekt einer gehosteten Blazor Lösung als ASP.NET Core App, die den allgemeinen Anleitungen in diesem Artikel folgt.

Darüber hinaus sollten Projekte, die Benutzer bei Client-Apps Blazor WebAssembly mit Azure Active Directory (AAD) oder B2C authentifizieren, Server neue Microsoft Identity v2.0-Pakete einführen:

Für AAD:

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

Für 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}" />

Bestimmen Sie für die vorherigen Paketverweise die Paketversionen für die {VERSION} Platzhalter bei NuGet.org:

Hinweis

Das SDK des Server Projekts in einer gehosteten Blazor WebAssembly Lösung bleibt:Microsoft.NET.Sdk.Web

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

Weitere Informationen finden Sie unter

Bereinigen und Neu erstellen Sie die Lösung

Nach der Migration der App oder Lösung zu .NET 5 müssen Sie die App oder Lösung bereinigen und neu erstellen. Wenn Paketkonkompatibilitäten zwischen neuen Paketbezügen und zwischengespeicherten Paketen vorhanden sind:

  1. Löschen Sie NuGet-Paketcaches, indem Sie den folgenden dotnet nuget locals Befehl in einer Befehlsshell ausführen:

    dotnet nuget locals --clear all
    
  2. Bereinigen und Neu erstellen Sie die App oder Lösung.

Problembehandlung

Folgen Sie den Anleitungen zur Problembehandlung am Ende des Blazor WebAssembly Sicherheitsthemas, das für Ihre App gilt:

Eigenständige Blazor WebAssembly-Apps:

Gehostete Blazor WebAssembly-Apps:

Nicht autorisierter Client für Azure Active Directory (AAD)

Nach dem Upgrade einer Blazor WebAssembly App, die AAD für die Authentifizierung verwendet, erhalten Sie möglicherweise den folgenden Fehler beim Anmelderückruf an die App, nachdem sich der Benutzer mit AAD angemeldet hat:

Info: Die Autorisierung von Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Authorization ist fehlgeschlagen. Diese Anforderungen wurden nicht erfüllt: DenyAnonymousAuthorizationRequirement: Erfordert einen authentifizierten Benutzer.

Anmelderückruffehler von AAD:

  • Fehler: unauthorized_client
  • Description (Beschreibung): AADB2C90058: The provided application is not configured to allow public clients.

So beheben Sie den Fehler

  1. Greifen Sie im Azure-Portal auf das Manifest der App zu.
  2. Legen Sie das allowPublicClient-Attribut auf null oder true fest.

Aktualisieren einer Blazor progressiven Webanwendung (PWA)

Fügen Sie das folgende Element zur Projektdatei der PWA-App hinzu:

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

Wenn das Projekt wwwroot/index.html (Blazor WebAssembly) oder Pages/_Host.cshtml (Blazor Server) ein Stylesheetelement <link> für scoped.styles.css eine frühere Version von 5.0 enthält, entfernen Sie das <link> Tag:

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

Aktualisieren Razor von Klassenbibliotheken (RCLs)

Migrieren Sie Razor Klassenbibliotheken (RCLs), um neue APIs oder Features zu nutzen, die als Teil von ASP.NET Core 5.0 eingeführt werden.

So aktualisieren Sie eine RCL, die auf Komponenten ausgerichtet ist:

  1. Aktualisieren Sie die folgenden Eigenschaften in der Projektdatei:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Aktualisieren Sie andere Pakete auf ihre neuesten Versionen. Die neuesten Versionen finden Sie unter NuGet.org.

Um eine RCL-Ziel-MVC zu aktualisieren, aktualisieren Sie die folgenden Eigenschaften in der Projektdatei:

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

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

Aktualisieren von Paketverweisen

Aktualisieren Sie in der Projektdatei jedes Microsoft.AspNetCore.*-, Microsoft.EntityFrameworkCore.*-, Microsoft.Extensions.*- und System.Net.Http.Json-PaketreferenzsattributsVersion auf 5.0.0 oder höher. Zum Beispiel:

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

Aktualisieren von Docker-Images

Aktualisieren Sie für Apps mit Docker Ihre Dockerfile-AnweisungenFROM und -Skripts. Verwenden Sie ein Basisbild, das die laufzeit ASP.NET Core 5.0 enthält. Berücksichtigen Sie den folgenden docker pull Befehlsunterschied zwischen ASP.NET Core 3.1 und 5.0:

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

Als Teil des Wechsels zu ".NET" als Produktname wurden die Docker-Images aus den mcr.microsoft.com/dotnet/core Repositorys in mcr.microsoft.com/dotnetdie Repositorys verschoben. Weitere Informationen finden Sie unter dotnet/dotnet-docker#1939.

Modellbindungsänderungen in ASP.NET Core MVC und Razor Pages

DateTime-Werte sind modellgebunden als UTC-Zeiten

In ASP.NET Core 3.1 und früheren DateTime Versionen wurden Werte als lokale Zeit modellgebunden, wobei die Zeitzone vom Server bestimmt wurde. DateTime Werte, die von der Eingabeformatierung (JSON) gebunden sind, und DateTimeOffset Werte wurden als UTC-Zeitzonen gebunden.

In ASP.NET Core 5.0 und höher bindet DateTime die Modellbindung werte konsistent mit der UTC-Zeitzone.

Um das vorherige Verhalten beizubehalten, entfernen Sie folgendes DateTimeModelBinderProviderStartup.ConfigureServices:

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Um Unterstützung für Modellbindungs-C# 9-Datensatztypen hinzuzufügen, lautet folgendes ComplexTypeModelBinderProvider :

  • Als veraltet gekennzeichnet.
  • Standardmäßig nicht mehr registriert.

Apps, die auf die Anwesenheit der ComplexTypeModelBinderProviderModelBinderProviders Sammlung angewiesen sind, müssen auf den neuen Ordneranbieter verweisen:

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

UseDatabaseErrorPage veraltet

Die ASP.NET Core 3.1-Vorlagen, die eine Option für einzelne Benutzerkonten enthalten, generieren einen Aufruf an UseDatabaseErrorPage. UseDatabaseErrorPage ist jetzt veraltet und sollte durch eine Kombination von AddDatabaseDeveloperPageExceptionFilter und UseMigrationsEndPoint, wie im folgenden Code dargestellt, ersetzt werden:

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

Weitere Informationen finden Sie in diesem GitHub-Issue.

ASP.NET Core Modul (ANCM)

Wenn das ASP.NET Core Modul (ANCM) keine ausgewählte Komponente war, wenn Visual Studio installiert wurde oder eine frühere Version des ANCM auf dem System installiert wurde, laden Sie das neueste .NET Core Hosting Bundle Installer (direct download) herunter, und führen Sie das Installationsprogramm aus. Weitere Informationen finden Sie unter Hosting-Bundle.

Paketreferenzänderungen, die sich auf einige NuGet-Pakete auswirken

Mit der Migration einiger Microsoft.Extensions.* NuGet-Pakete aus dem Dotnet/Extensions-Repository zu dotnet/runtime, wie in der Migration von dotnet/extensions content to dotnet/runtime und dotnet/aspnetcore (aspnet/Announcements #411) beschrieben, werden Paketänderungen auf einige der migrierten Pakete angewendet. Diese Änderungen führen häufig zu Namespaceänderungen für .NET-API.

Verwenden Sie den .NET-API-Browser, um weitere APIs für App-Namespaceänderungen zu suchen, wenn Sie zu 5.0 migrieren.

Überprüfen von Änderungsänderungen

Informationen zum Unterbrechen von Änderungen von .NET Core 3.1 zu .NET 5.0 finden Sie unter "Grundlegende Änderungen für die Migration von Version 3.1 bis 5.0". ASP.NET Core und Entity Framework Core sind auch in der Liste enthalten.