Migrieren von ASP.NET Core 3.1 zu 5.0

Von Scott Addie

In diesem Artikel wird erläutert, wie Sie ein vorhandenes ASP.NET Core 3.1-Projekt auf ASP.NET Core 5.0 aktualisieren.

Voraussetzungen

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

Wenn Sie für eine bestimmte .NET Core SDK-Version auf eineglobal.js-Datei angewiesen sind, aktualisieren Sie die -Eigenschaft auf die version installierte .NET 5.0 SDK-Version. Beispiel:

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

Aktualisieren des Zielframework

Wenn Sie ein Projekt Blazor WebAssembly aktualisieren, fahren Sie mit dem Abschnitt Aktualisieren Blazor WebAssembly von Projekten fort. Aktualisieren Sie für ASP.NET Core Projekttyp den Zielframeworkmoniker (Target Framework Moniker, TFM) der Projektdatei auf net5.0 :

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

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

</Project>

Ordner bin und obj löschen

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

Änderungen an Blazor der Logik für das App-Routing in Version 5.0.1 und weiteren Versionen von 5.x bis 6.0

Die Berechnung der Routenfolge hat sich im ASP.NET Core 5.0.1-Patchversion geändert. Dies kann sich auf Sie auswirken, wenn Sie catch-all-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 wie {*slug} /customer/{id} übereinstimmen.

Neues Verhalten

Das neue Verhalten in ASP.NET Core 5.0.1 oder höher stimmt stärker mit dem in ASP.NET Core-Apps definierten Routingverhalten zusammen, bei dem das Framework zuerst die Routenrangfolge für jedes Segment berechnet und fest legt und nur die Länge der Route verwendet, um Bindungen als sekundäre Kriterien zu unterbricht.

Grund für die Änderung

Das ursprüngliche Verhalten wird als Fehler in der Implementierung betrachtet, da unser Ziel ist, dass sich das Routingsystem auf die gleiche Weise verhält wie das ASP.NET Core-Routingsystem für die Teilmenge der Features, die vom Routing Blazor unterstützt Blazor werden.

Fügen Sie PreferExactMatches der Komponente in der Datei das Router -Attribut App.razor hinzu, um das richtige Verhalten zu wählen:

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

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

Wichtig

Alle Apps sollte explizit auf PreferExactMatches festgelegt @true werden.

Die Möglichkeit, auf oder nicht festgelegt PreferExactMatches @false zu lassen, wird nur aus Gründen der 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 Anleitung in diesem Abschnitt gilt für beide Blazor Hostingmodelle. Die abschnitte, die diesem Abschnitt folgen, enthalten zusätzliche Anleitungen speziell für das Hosten von Modellen und App-Typen. Wenden Sie die Anleitung aus allen relevanten Abschnitten auf Ihre App an.

  1. Fügen Sie in einer App oder der einer App dem -Element ein wwwroot/index.html Blazor WebAssembly Pages/_Host.cshtml Blazor Server <link> <head> -Element für Stile hinzu. In den folgenden <link> href Elementattributwerten ist der Platzhalter {ASSEMBLY NAME} der Assemblyname der App.

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

    Eigenständig Blazor WebAssembly oder Blazor Server Beispiel:

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

    Client Projekt einer gehosteten Blazor WebAssembly Projektmappe– Beispiel:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Schließen Sie einen neuen Namespace in die Datei der App für _Imports.razor die Komponentenvirtualisierungein. Microsoft.AspNetCore.Components.Web.Virtualization Die folgenden _Imports.razor Dateien zeigen die Standardnamespaces in Apps, 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. Umschließen Sie in der -Komponente ( ) das HTML-Markup der Komponente mit einem -Element, für das MainLayout Shared/MainLayout.razor ein <div> class -Attribut auf festgelegt page ist:

    <div class="page">
    
        ...
    
    </div>
    
  4. Fügen Sie dem Ordner die folgenden Dateien Shared 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 wwwroot/css/app.css Basisdatei einer Blazor WebAssembly App oder Datei einer App enthält die folgenden wwwroot/css/site.css Blazor Server Formate. Entfernen Sie zusätzliche Stile, und lassen Sie die folgenden Stile und alle stile, die Sie der App hinzugefügt haben.

    Das folgende Stylesheet enthält nur Basisstile und keine vom Entwickler hinzugefügten benutzerdefinierten Stile:

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

Aktualisieren von Blazor WebAssembly Projekten

Befolgen Sie die Anweisungen im vorherigen Abschnitt Aktualisieren Blazor WebAssembly und Blazor Server Projekte.

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

  1. Aktualisieren Sie das SDK von Microsoft.NET.Sdk.Web in 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 Projekte Client gehosteter Blazor Projektlö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 die neuesten Versionen. Die neuesten Versionen finden Sie auf NuGet.org.

  5. Ändern wwwroot/index.html Sie in das Element, das die Komponente in ein App <div> -Element lädt, bei dem id auf festgelegt app ist:

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

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Ändern Program.Main Sie in ( ) eine vorübergehende Program.cs HttpClient Standardregistrierung in bereichsd, falls 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 ( ) der App Program.cs Client gehosteter Blazor Lösungen:

    • Ersetzen Sie optional builder.HostEnvironment.BaseAddress Zeichenfolgenclientbasisadressen.
    • Ändern Sie alle benannten vorübergehenden Client factory-Registrierungen in Bereichsumfang.
    -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 vorangehenden Code ist {APP NAMESPACE} der Platzhalter der Namespace der App.

Eigenständige Blazor WebAssembly App mit Microsoft-Konten

Befolgen Sie die Anweisungen in den vorherigen Abschnitten Aktualisieren Blazor WebAssembly und Blazor Server Projekte und Aktualisieren Blazor WebAssembly von Projekten.

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

  • Für die App sind die openid Bereiche und offline_access erforderlich:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Führen Sie auf Azure-Portal Blatt Authentifizierung für die App-Registrierung aus:

    1. Entfernen Sie die Webplattformkonfiguration.
    2. Fügen Sie eine Konfiguration der Single-Page-Anwendungsplattform mit dem Umleitungs-URI der App hinzu.
    3. Deaktivieren Sie die 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)

Befolgen Sie die Anweisungen in den vorherigen Abschnitten Aktualisieren Blazor WebAssembly und Blazor Server Projekte und Aktualisieren Blazor WebAssembly von Projekten.

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

  • Für die App ist der Bereich https://graph.microsoft.com/User.Read erforderlich:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Führen Sie auf Azure-Portal Blatt Authentifizierung für die App-Registrierung aus:

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

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

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

Befolgen Sie die Anweisungen in den vorherigen Abschnitten Aktualisieren Blazor WebAssembly und Blazor Server Projekte und Aktualisieren Blazor WebAssembly von Projekten.

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

  • Für die App sind die openid Bereiche und offline_access erforderlich:

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Führen Sie auf Azure-Portal Blatt Authentifizierung für die App-Registrierung aus:

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

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

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

Befolgen Sie die Anweisungen in den vorherigen Abschnitten Aktualisieren Blazor WebAssembly und Blazor Server Projekte und Aktualisieren Blazor WebAssembly von Projekten.

Bei der App-Registrierung einer gehosteten Lösung, die AAD oder AAD B2C für die Benutzerauthentifizierung verwendet, sollte eine Einzelseitenanwendung für die Client Blazor Azure Apps-Plattformkonfiguration verwendet werden.

Führen Sie auf Azure-Portal Client Blatt Authentifizierung für die App-Registrierung aus:

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

Weitere Informationen finden Sie unter:

Aktualisieren des Serverprojekts einer gehosteten Blazor Projektmappe

Befolgen Sie die Anweisungen in den vorherigen Abschnitten:

Aktualisieren Sie das Server Projekt einer gehosteten Blazor Projektmappe als ASP.NET Core-App gemäß den allgemeinen Anweisungen in diesem Artikel.

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

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 auf NuGet.org:

Hinweis

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

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

Weitere Informationen finden Sie unter:

Bereinigen und Neuerstellen der Projektmappe

Nachdem Sie die App oder Projektmappe zu .NET 5 migriert haben, bereinigen Sie die App oder Projektmappe, und erstellen Sie sie neu. Wenn Paketinkompatibilitäten zwischen neuen Paketverweisen und zwischengespeicherten Paketen bestehen:

  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 Sie die App oder Projektmappe, und erstellen Sie sie neu.

Problembehandlung

Befolgen Sie die Anleitung 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 Attribut allowPublicClient auf null oder true fest.

Aktualisieren einer Blazor progressiven Webanwendung (PWA)

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

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

Wenn die ( ) oder ( ) des Projekts wwwroot/index.html Blazor WebAssembly ein Pages/_Host.cshtml Blazor Server <link> Stylesheetelement für aus einer scoped.styles.css früheren Vorschauversion 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 im Rahmen von ASP.NET Core 5.0 eingeführt werden.

So aktualisieren Sie eine RCL für Komponenten:

  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 die neuesten Versionen. Die neuesten Versionen finden Sie unter NuGet.org.

Um eine RCL für 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 jede Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*und System.Net.Http.Jsfür das Version Paketverweisattribut auf 5.0.0 oder höher. 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, die Docker verwenden, Ihre Dockerfile-Anweisungen FROM und -Skripts. Verwenden Sie ein Basisimage, das die ASP.NET Core 5.0-Runtime enthält. Beachten 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

Im Rahmen der Umstellung auf ".NET" als Produktname wurden die Docker-Images aus den mcr.microsoft.com/dotnet/core Repositorys in mcr.microsoft.com/dotnet verschoben. Weitere Informationen finden Sie unter dotnet/dotnet-docker#1939.

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

DateTime-Werte sind als UTC-Zeiten an das Modell gebunden.

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

In ASP.NET Core 5.0 und höher bindet die Modellbindung DateTime kontinuierlich Werte an die UTC-Zeitzone.

Um das vorherige Verhalten beizubehalten, entfernen Sie in DateTimeModelBinderProvider Startup.ConfigureServices :

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder ersetzen ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Um Unterstützung für die Modellbindung von C# 9-Eintragstypenhinzuzufügen, ist der ComplexTypeModelBinderProvider folgende:

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

Apps, die auf dem Vorhandensein von ComplexTypeModelBinderProvider in der ModelBinderProviders Sammlung basieren, müssen auf den neuen Binderanbieter 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 von UseDatabaseErrorPage . UseDatabaseErrorPage ist jetzt veraltet und sollte durch eine Kombination aus und ersetzt AddDatabaseDeveloperPageExceptionFilter UseMigrationsEndPoint werden, wie im folgenden Code gezeigt:

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.

Überprüfen von Breaking Changes

Breaking Changes von .NET Core 3.1 zu .NET 5.0 finden Sie unter Breaking Changes für die Migration von Version 3.1 zu 5.0. ASP.NET Core und Entity Framework Core sind ebenfalls in der Liste enthalten.