Migrer d’ASP.NET Core 3.1 vers 5.0

Cet article explique comment mettre à jour un projet ASP.NET Core 3.1 existant vers ASP.NET Core 5.0. Pour obtenir des instructions sur la migration d'ASP.NET Core 3.1 vers ASP.NET Core 6.0, consultez Migrer d'ASP.NET Core 3.1 vers 6.0.

Prérequis

Mettre à jour la version du SDK .NET Core dans global.json

Si vous comptez sur un fichier global.json pour cibler une version spécifique du kit SDK .NET Core, mettez à jour la propriété version vers la version du SDK .NET 5.0 qui est installée. Par exemple :

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

Mettre à jour le framework cible

Si vous mettez à jour un projet Blazor WebAssembly, passez à la section Mettre à jour Blazor WebAssembly les projets . Pour tout autre type de projet ASP.NET Core, mettez à jour le fichier projet du moniker de framework cible vers net5.0:

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

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

</Project>

Supprimez les dossiers bin et obj

Vous devrez peut-être supprimer les dossiers bin et obj. Exécutez dotnet nuget locals --clear all pour effacer le cache de package NuGet.

Modifications apportées à la logique de routage des applications Blazor dans la version 5.0.1 et les autres versions 5.x jusqu’à la version 6.0

Le calcul de la priorité de routage a changé dans la version corrective ASP.NET Core 5.0.1. Cela peut vous affecter si vous avez défini des itinéraires fourre-tout ou des itinéraires avec des paramètres facultatifs.

Ancien comportement

Avec le comportement précédent dans ASP.NET Core 5.0.0 ou version antérieure, les itinéraires dont la priorité est inférieure, comme {*slug}, sont mis en correspondance avant les itinéraires ayant une priorité plus élevée, tels que /customer/{id}.

Nouveau comportement

Le nouveau comportement dans ASP.NET Core 5.0.1 ou version ultérieure correspond plus étroitement au comportement de routage défini dans ASP.NET Core applications, où l’infrastructure calcule et établit d’abord la priorité d’itinéraire pour chaque segment et utilise uniquement la longueur de l’itinéraire pour rompre les liens comme critère secondaire.

Raison du changement

Le comportement d’origine est considéré comme un bogue dans l’implémentation, car notre objectif est que le système de routage Blazor se comporte de la même manière que le système de routage ASP.NET Core pour le sous-ensemble de fonctionnalités prises en charge par le routage de Blazor.

Ajoutez l’attribut PreferExactMatches au composantRouter dans le fichier App.razor pour choisir le comportement correct :

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

Lorsque PreferExactMatches est défini sur @true, la correspondance de route préfère les correspondances exactes aux caractères génériques.

Important

Toutes les applications doivent explicitement définir PreferExactMatches sur @true.

La possibilité de définir PreferExactMatchessur @false ou de le laisser non défini est fournie uniquement pour la compatibilité descendante.

Lorsque .NET 6 sera mis en production, le routeur préférera toujours des correspondances exactes, et l’option PreferExactMatches ne sera pas disponible.

Mettez à jour les projetsBlazor WebAssembly et Blazor Server

Les conseils de cette section s’appliquent aux deux modèles d’hébergement Blazor. Les sections qui suivent cette section fournissent des conseils supplémentaires spécifiques aux modèles d’hébergement et aux types d’applications. Appliquez les conseils de toutes les sections pertinentes à votre application.

  1. Dans wwwroot/index.html d’une application Blazor WebAssembly ou de Pages/_Host.cshtmld’une applicationBlazor Server, ajoutez un élément <link> à l’élément <head> pour les styles. Dans les valeurs d’attribut d’élément <link> suivanteshref, l’espace réservé {ASSEMBLY NAME} est le nom de l’assembly de l’application.

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

    Autonome Blazor WebAssembly ou exemple Blazor Server :

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

    Exemple du projet Client d’une solution Blazor WebAssemblyhébergée

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Incluez un nouvel espace de noms dans le fichier _Imports.razorde l’application pour la virtualisation des composants, Microsoft.AspNetCore.Components.Web.Virtualization. Les fichiers _Imports.razor suivants affichent les espaces de noms par défaut dans les applications générées à partir des modèles de projet Blazor. L’espace réservé {ASSEMBLY NAME} est le nom de l’assembly de l’application.

    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. Dans le composant MainLayout(Shared/MainLayout.razor), entourez le balisage HTML du composant avec un élément <div> dont l’attribut class est défini sur page:

    <div class="page">
    
        ...
    
    </div>
    
  4. Ajouter les fichiers suivants au dossier Shared :

    MainLayout.razor.css:

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

    NavMenu.razor.css:

    .navbar-toggler {
        background-color: rgba(255, 255, 255, 0.1);
    }
    
    .top-row {
        height: 3.5rem;
        background-color: rgba(0,0,0,0.4);
    }
    
    .navbar-brand {
        font-size: 1.1rem;
    }
    
    .oi {
        width: 2rem;
        font-size: 1.1rem;
        vertical-align: text-top;
        top: -2px;
    }
    
    .nav-item {
        font-size: 0.9rem;
        padding-bottom: 0.5rem;
    }
    
        .nav-item:first-of-type {
            padding-top: 1rem;
        }
    
        .nav-item:last-of-type {
            padding-bottom: 1rem;
        }
    
        .nav-item ::deep a {
            color: #d7d7d7;
            border-radius: 4px;
            height: 3rem;
            display: flex;
            align-items: center;
            line-height: 3rem;
        }
    
    .nav-item ::deep a.active {
        background-color: rgba(255,255,255,0.25);
        color: white;
    }
    
    .nav-item ::deep a:hover {
        background-color: rgba(255,255,255,0.1);
        color: white;
    }
    
    @media (min-width: 768px) {
        .navbar-toggler {
            display: none;
        }
    
        .collapse {
            /* Never collapse the sidebar for wide screens */
            display: block;
        }
    }
    
  5. Le dernier fichier de base wwwroot/css/app.css d’une application Blazor WebAssemblyou d’un fichierwwwroot/css/site.css d’une application Blazor Server inclut les styles suivants. Supprimez les styles supplémentaires en laissant les styles suivants et tous les styles que vous avez ajoutés à l’application.

    La feuille de style suivante inclut uniquement les styles de base et n’inclut pas les styles personnalisés ajoutés par le développeur :

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

    Remarque

    L’exemple précédent n’affiche pas la directive @import pour les icônes Open Iconic (open-iconic-bootstrap.css), fournies par le modèle de projet Blazor. Open Icon a été abandonné par ses mainteneurs.

Mettre à jour des projets Blazor WebAssembly

Suivez les instructions de la section précédente Mise à jour Blazor WebAssembly et de la section Blazor Server projets .

Pour un projet Blazor WebAssembly, y compris le projet Client d’une solution hébergée Blazor , appliquez les modifications suivantes au fichier projet :

  1. Mettez à jour le Kit de développement logiciel (SDK) de Microsoft.NET.Sdk.Web vers Microsoft.NET.Sdk.BlazorWebAssembly:

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

    Remarque

    Cette mise à jour s’applique uniquement aux projets autonomes Blazor WebAssembly et aux projets Client de solutions Blazor hébergées .

  2. Mettez les propriétés suivantes à jour :

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Supprimez la référence de package à Microsoft.AspNetCore.Components.WebAssembly.Build :

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Mettez à jour d’autres packages vers leurs dernières versions. Vous trouverez les dernières versions sur NuGet.org.

  5. Dans wwwroot/index.html, remplacez l’élément qui charge le composant App par un élément <div> dont la valeur id est configurée sur app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. Dans Program.Main (Program.cs), remplacez la référence à l’élément <app> par un sélecteur CSS en lui ajoutant un hachage # :

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. Dans Program.Main (Program.cs), remplacez une inscription temporaire par défaut HttpClient en étendue, le cas échéant :

    -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. Dans Program.Main (Program.cs) de l’application Client des solutions Blazor hébergées :

    • Si vous le souhaitez, remplacezbuilder.HostEnvironment.BaseAddress par les adresses de base du client de chaîne.
    • Remplacez toutes les inscriptions de fabrique client temporaires nommées en étendue.
    -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"));
    

    Dans l’exemple précédent, l’espace réservé {APP NAMESPACE} est l’espace de noms de l’application.

Application autonome Blazor WebAssemblyavec des comptes Microsoft

Suivez les instructions de la section précédente Mise à jour Blazor WebAssembly et de la section Blazor Server projets et Mise à jourBlazor WebAssembly des projets.

Pour qu’une application Blazor WebAssembly autonome inscrite dans le portail Azure utilise Microsoft Entra ID (ME-ID) pour les comptes Microsoft :

  • L’application nécessite les tendues openidet offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Dans le panneau inscription d’application Portail Azure Authentification :

    1. Ajoutez la configuration de la plateforme web.
    2. Ajoutez une configuration de plateforme d’application monopage avec l’URI de redirection de l’application.
    3. Désactivez l’octroi implicite pour les jetons d’accès et lesjetons d’ID.

Pour plus d’informations, consultez Sécuriser une application ASP.NET Core Blazor WebAssembly autonome avec les Comptes Microsoft .

Application Blazor WebAssembly autonome avec Microsoft Entra ID (ME-ID)

Suivez les instructions de la section précédente Mise à jour Blazor WebAssembly et de la section Blazor Server projets et Mise à jourBlazor WebAssembly des projets.

Pour qu’une application autonome Blazor WebAssembly inscrite dans le portail Azure utilise Microsoft Entra ID (ME-ID) :

  • L’application nécessite l’étendue https://graph.microsoft.com/User.Read :

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • Dans le panneau inscription d’application Portail Azure Authentification :

    1. Ajoutez la configuration de la plateforme web.
    2. Ajoutez une configuration de plateforme d’application monopage avec l’URI de redirection de l’application.
    3. Désactivez l’octroi implicite pour les jetons d’accès et lesjetons d’ID.

Pour plus d’informations, consultez Sécuriser une application autonome ASP.NET Core Blazor WebAssembly avec Microsoft Entra ID.

Application autonome Blazor WebAssembly avec Azure Active Directory (AAD) B2C

Suivez les instructions de la section précédente Mise à jour Blazor WebAssembly et de la section Blazor Server projets et Mise à jourBlazor WebAssembly des projets.

Pour qu’une application autonome Blazor WebAssembly inscrite dans le Portail Azure utilise Azure Active Directory (AAD) B2C:

  • L’application nécessite les tendues openidet offline_access :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • Dans le panneau inscription d’application Portail Azure Authentification :

    1. Ajoutez la configuration de la plateforme web.
    2. Ajoutez une configuration de plateforme d’application monopage avec l’URI de redirection de l’application.
    3. Désactivez l’octroi implicite pour les jetons d’accès et lesjetons d’ID.

Pour plus d’informations, consultez Sécuriser une application ASP.NET Core Blazor WebAssembly autonome avec Azure Active Directory B2C.

Application Blazor WebAssembly hébergée avec Microsoft Entra ID (ME-ID) ou AAD B2C

Suivez les instructions de la section précédente Mise à jour Blazor WebAssembly et de la section Blazor Server projets et Mise à jourBlazor WebAssembly des projets.

L’inscription d’application Clientd’une solution Blazor hébergée qui utilise AAD ou AAD B2C pour l’authentification utilisateur doit utiliser une configuration de plateforme Azure Apps à page unique .

Dans le panneau ClientAuthentification de l’inscription d’application Portail Azure :

  1. Ajoutez la configuration de la plateforme web.
  2. Ajoutez une configuration de plateforme d’application monopage avec l’URI de redirection de l’application.
  3. Désactivez l’octroi implicite pour les jetons d’accès et lesjetons d’ID.

Pour plus d'informations, consultez les pages suivantes :

Mettre à jour le projet serveur d’une solution hébergée Blazor

Suivez les instructions des sections précédentes :

Mettez à jour le projet Server d’une solution Blazor hébergée en tant qu’application ASP.NET Core en suivant les instructions générales de cet article.

En outre, Server projets qui authentifient les utilisateurs auprès des applications clientes Blazor WebAssembly avec Microsoft Entra ID (ME-ID) ou B2C doivent adopter de nouveaux packages Microsoft Identity v2.0 :

Pour AAD :

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

Pour 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}" />

Pour les références de package précédentes, déterminez les versions de package pour les espaces réservés {VERSION} de NuGet.org :

Remarque

Le SDK du projet Serverdans une solution Blazor WebAssembly hébergée restent Microsoft.NET.Sdk.Web :

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

Pour plus d'informations, consultez les pages suivantes :

Nettoyer et reconstruire la solution

Après avoir migré l’application ou la solution vers .NET 5, propre et régénérez l’application ou la solution. Si des incompatibilités de package existent entre les nouvelles références de package et les packages mis en cache :

  1. Installez le package NuGet en exécutant la commande suivante dotnet nuget locals dans un interpréteur de commandes :

    dotnet nuget locals --clear all
    
  2. Nettoyez et régénérez l’application ou la solution.

Résoudre des problèmes

Suivez les conseils de résolution des problèmes à la fin de la rubrique de sécurité Blazor WebAssembly qui s’applique à votre application :

Applications Blazor WebAssembly autonomes :

Applications Blazor WebAssembly hébergées :

Client non autorisé pour Microsoft Entra ID (ME-ID)

Après la mise à niveau d’une application Blazor WebAssembly qui utilise AAD pour l’authentification, vous pouvez recevoir l’erreur suivante lors du rappel de connexion à l’application une fois que l’utilisateur s’est connecté avec AAD :

Info : Échec de l’autorisation Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]. Ces conditions n’ont pas été remplies : DenyAnonymousAuthorizationRequirement : Nécessite un utilisateur authentifié.

Erreur de rappel de connexion à partir d’AAD :

  • Erreur : unauthorized_client
  • Description : AADB2C90058: The provided application is not configured to allow public clients.

Pour résoudre l’erreur :

  1. Dans le portail Azure, accédez au manifeste de l’application.
  2. Définissez l’attribut allowPublicClient sur null ou true.

Mettre à jour une Application web progressive (PWA) Blazor

Ajoutez l’élément suivant au fichier projet de l’application PWA :

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

Si le projet wwwroot/index.html (Blazor WebAssembly) ou Pages/_Host.cshtml (Blazor Server) contient un élément de feuille de style <link> pour scoped.styles.css une version préliminaire 5.0 antérieure, supprimez la balise<link> :

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

Mettre à jour les Razor bibliothèques de classes (RCL)

Migrez des Razor bibliothèques de classes (RCL) pour tirer parti des nouvelles API ou fonctionnalités introduites dans le cadre de ASP.NET Core 5.0.

Pour mettre à jour une RCL qui cible des composants :

  1. Mettez à jour les propriétés suivantes dans le fichier projet :

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Mettez à jour d’autres packages vers leurs dernières versions. Vous trouverez les dernières versions sur NuGet.org.

Pour mettre à jour une RCL ciblant MVC, mettez à jour les propriétés suivantes dans le fichier projet :

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

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

Mettre à jour les références de package

Dans le fichier projet, mettez à jour chaque référence de package Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.* et System.Net.Http.Json avec l’attribut  Version5.0.0 ou version ultérieure. Par exemple :

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

Mettre à jour les images Docker

Pour les applications utilisant Docker, mettez à jour vos instructions et scripts Dockerfile FROM. Utilisez une image de base qui inclut le runtime ASP.NET Core 5.0. Considérez la différence de commande docker pullsuivante entre ASP.NET Core 3.1 et 5.0 :

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

Dans le cadre du déplacement vers «.NET » comme nom de produit, les images Docker ont été déplacées des référentiels mcr.microsoft.com/dotnet/core vers mcr.microsoft.com/dotnet. Pour plus d’informations, consultez dotnet/dotnet-docker#1939.

Modifications de liaison de modèle dans ASP.NET Core MVC et Razor Pages

Les valeurs DateTime sont liées au modèle en tant qu’heures UTC

Dans ASP.NET Core 3.1 et versions antérieures, les valeursDateTime étaient liées au modèle en tant qu’heure locale, où le fuseau horaire était déterminé par le serveur. Les valeurs DateTime liées à partir de la mise en forme d’entrée (JSON) et les valeurs DateTimeOffset ont été liées en tant que fuseaux horaires UTC.

Dans ASP.NET Core 5.0 et versions ultérieures, la liaison de modèle lie systématiquement les valeurs DateTime au fuseau horaire UTC.

Pour conserver le comportement précédent, supprimez DateTimeModelBinderProviderdans Startup.ConfigureServices:

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Pour ajouter la prise en charge de liaison de modèle des types d’enregistrementsC# 9 , leComplexTypeModelBinderProvider est :

  • Annoté comme obsolète.
  • N’est plus inscrit par défaut.

Les applications qui s’appuient sur la présence du ComplexTypeModelBinderProvider dans la collection ModelBinderProvidersdoivent référencer le nouveau fournisseur de classeurs :

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

UseDatabaseErrorPage obsolete

Les modèles ASP.NET Core 3.1 qui incluent une option pour les comptes d’utilisateur individuels génèrent un appel à UseDatabaseErrorPage. UseDatabaseErrorPage est désormais obsolète et doit être remplacé par une combinaison de AddDatabaseDeveloperPageExceptionFilter et UseMigrationsEndPoint, comme indiqué dans le code suivant :

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

Pour plus d’informations, consultez ce problème GitHub.

Module de base ASP.NET (ANCM)

Si le module ASP.NET Core (ANCM) n'était pas un composant sélectionné lors de l'installation de Visual Studio ou si une version antérieure de l'ANCM était installée sur le système, téléchargez le dernier programme d'installation du pack .NET Core Hosting (téléchargement direct) et exécutez l'installateur. Pour plus d'informations, consultez Pack d'hébergement.

Extensions : Modification des références de package affectant certains packages NuGet

Avec la migration de certains Microsoft.Extensions.*packages NuGet du référentiel dotnet/extensions vers dotnet/runtime, tels que décrite dans Migration du contenu dotnet/extensions vers dotnet/runtime et dotnet/aspnetcore (cf. aspnet/Announcements #411), des modifications du packaging sont appliquées à certains des packages migrés. Ces modifications entraînent souvent des modifications d’espace de noms pour l’API .NET.

Pour rechercher plus en détail les API concernant les modifications apportées à l’espace de noms d’application lors de la migration vers la version 5.0, utilisez le navigateur d’API .NET.

Migrer Microsoft.Identity. Web

Les pages wiki suivantes expliquent comment migrer Microsoft.Identity. Web de ASP.NET Core 3.1 à 5.0 :

Les didacticiels suivants expliquent également la migration :

Examiner les changements avec rupture

Pour connaître les changements disruptifs de .NET Core 3.1 vers .NET 5.0, consultez Changements disruptifs pour la migration de la version 3.1 vers la version 5.0. ASP.NET Core et Entity Framework Core sont également inclus dans la liste.