Migración de ASP.NET Core 3.1 a 5.0

En este artículo se explica cómo actualizar un proyecto de ASP.NET Core 3.1 existente a ASP.NET Core 5.0. Para obtener instrucciones sobre cómo migrar de ASP.NET Core 3.1 a ASP.NET Core 6.0, consulte Migración de ASP.NET Core 3.1 a 6.0.

Requisitos previos

Actualización de la versión del SDK de .NET Core en global.json

Si confía en que un archivo global.json se dirija a una versión específica del SDK de .NET Core, actualice la propiedad version a la versión del .NET SDK 5.0 instalada. Por ejemplo:

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

Actualización de la plataforma de destino

Si actualiza un Blazor WebAssembly proyecto, vaya a la sección Actualizar Blazor WebAssembly proyectos . Para cualquier otro tipo de proyecto de ASP.NET Core, actualice el moniker de la plataforma de destino (TFM) del archivo de proyecto a net5.0:

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

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

</Project>

Eliminar las carpetas bin y obj

Es posible que tenga que eliminar las carpetas bin y obj. Ejecute dotnet nuget locals --clear all para borrar la memoria caché del paquete NuGet.

Cambios en la Blazor lógica de enrutamiento de aplicaciones en la versión 5.0.1 y versiones posteriores de 5.x hasta 6.0

El cálculo de la prioridad de ruta cambió en la versión de revisión de ASP.NET Core 5.0.1. Esto puede afectarle si ha definido rutas de captura o rutas con parámetros opcionales.

Comportamiento anterior

Con el comportamiento anterior en ASP.NET Core 5.0.0 o versiones anteriores, las rutas con prioridad inferior, como {*slug}, se hacen coincidir antes de que las rutas tengan mayor prioridad, como /customer/{id}.

Comportamiento nuevo

El nuevo comportamiento de ASP.NET Core 5.0.1 o posterior coincide más estrechamente con el comportamiento de enrutamiento definido en ASP.NET Core aplicaciones, donde el marco procesa y establece primero la prioridad de ruta para cada segmento y solo usa la longitud de la ruta para romper los vínculos como criterios secundarios.

Motivo del cambio

El comportamiento original se considera un error en la implementación porque nuestro objetivo es que el Blazor sistema de enrutamiento se comporte de la misma manera que el sistema de enrutamiento ASP.NET Core para el subconjunto de características admitidas por Blazor el enrutamiento.

Agregue el PreferExactMatches atributo al Router componente del App.razor archivo para participar en el comportamiento correcto:

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

Cuando PreferExactMatches se establece en @true, la coincidencia de rutas prefiere las coincidencias exactas a los caracteres comodín.

Importante

Todas las aplicaciones deben establecer PreferExactMatches explícitamente en @true.

La capacidad de establecerPreferExactMatches en@false o dejarla sin establecer solo se proporciona para la compatibilidad con versiones anteriores.

Cuando se publique .NET 6, el enrutador preferirá siempre las coincidencias exactas, y la PreferExactMatches opción no estará disponible.

Actualización Blazor WebAssembly y Blazor Server proyectos

Las instrucciones de esta sección se aplican a ambos Blazor modelos de hospedaje. En las secciones siguientes a esta sección se proporcionan instrucciones adicionales específicas para hospedar modelos y tipos de aplicaciones. Aplique las guías de todas las secciones pertinentes a la aplicación.

  1. En wwwroot/index.html de una Blazor WebAssembly aplicación o Pages/_Host.cshtml de una Blazor Server aplicación, agregue un <link> elemento al <head> elemento para los estilos. En los siguientes <link> valores de atributo de elemento href , el marcador de posición {ASSEMBLY NAME} es el nombre del ensamblado de la aplicación.

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

    Independiente Blazor WebAssembly o Blazor Server ejemplo:

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

    Client proyecto de un ejemplo Blazor WebAssembly de solución alojada:

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Incluya un nuevo espacio de nombres en el _Imports.razorarchivo de la aplicación para la virtualización de componentes, Microsoft.AspNetCore.Components.Web.Virtualization. Los siguientes _Imports.razor archivos muestran los espacios de nombres predeterminados en las aplicaciones generadas a partir de las plantillas de Blazor proyecto. El marcador de posición {ASSEMBLY NAME} es el nombre de ensamblado de la aplicación.

    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. En el MainLayout componente (Shared/MainLayout.razor), rodea el marcado HTML del componente con un <div> elemento que tiene un class atributo establecido en page:

    <div class="page">
    
        ...
    
    </div>
    
  4. Añade los siguientes archivos a la Shared carpeta:

    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. El archivo base wwwroot/css/app.css más reciente de una Blazor WebAssembly aplicación o wwwroot/css/site.css archivo de una Blazor Server aplicación incluye los siguientes estilos. Elimine los estilos adicionales dejando los siguientes estilos y cualquiera que haya añadido a la aplicación.

    La hoja de estilos siguiente solo incluye estilos base y no incluye estilos personalizados agregados por el desarrollador:

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

    Nota:

    En el ejemplo anterior no se muestra la @import directiva para iconos de Open Iconic (open-iconic-bootstrap.css), proporcionada por la Blazor plantilla de proyecto. Open Iconic fue abandonado por sus mantenedores.

Actualización de proyectos de Blazor WebAssembly

Siga las instrucciones de la sección Actualización Blazor WebAssembly y Blazor Server proyectos anteriores.

Para un Blazor WebAssembly proyecto, incluido el Client proyecto de una solución hospedada Blazor , aplique los siguientes cambios en el archivo de proyecto:

  1. Actualice el SDK de Microsoft.NET.Sdk.Web a Microsoft.NET.Sdk.BlazorWebAssembly:

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

    Nota:

    Esta actualización solo se aplica a proyectos independientes Blazor WebAssembly y a los Client proyectos de soluciones hospedadas Blazor .

  2. Actualice las siguientes propiedades:

    <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.1</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  3. Quite la referencia del paquete a Microsoft.AspNetCore.Components.WebAssembly.Build:

    <ItemGroup>
    -    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
    
  4. Actualice otros paquetes a sus versiones más recientes. Las versiones más recientes se pueden encontrar en NuGet.org.

  5. En wwwroot/index.html, cambie el elemento que carga el App componente en un <div> elemento con un id establecido en app:

    -<app>Loading...</app>
    +<div id="app">Loading...</div>
    
  6. En Program.Main (Program.cs), cambie la referencia al <app> elemento a un selector CSS agregando un hash # a él:

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. En Program.Main (Program.cs), cambie un registro transitorio HttpClient predeterminado a con ámbito, si está presente:

    -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. En Program.Main (Program.cs) de la Client aplicación de soluciones hospedadas Blazor :

    • Opcionalmente, sustituya builder.HostEnvironment.BaseAddress las direcciones base de cliente de cadena.
    • Cambie los registros de fábrica de cliente transitorios con nombre a con ámbito.
    -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"));
    

    En el código anterior, el marcador de posición {APP NAMESPACE} es el nombre de espacio de la aplicación.

Aplicación independiente Blazor WebAssembly con Cuentas de Microsoft

Siga las orientaciones de las secciones anteriores Actualizar Blazor WebAssembly y Blazor Server proyectos y Actualizar Blazor WebAssembly proyectos .

Para que una aplicación independiente Blazor WebAssembly registrada en Azure Portal use microsoft Entra ID (ME-ID) para cuentas Microsoft:

  • La aplicación requiere los openid y offline_access ámbitos :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • En la hoja de Autenticación de registro de aplicaciones del portal Azure:

    1. Agregue la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicaciones de página única con el URI de redireccionamiento de la aplicación.
    3. Desactivar la concesión implícita para tokens de acceso y tokens de ID.

Para más información, consulte Protección de una aplicación ASP.NET Core Blazor WebAssembly independiente con Cuentas de Microsoft.

Aplicación independiente Blazor WebAssembly con el identificador de Entra de Microsoft (ME-ID)

Siga las orientaciones de las secciones anteriores Actualizar Blazor WebAssembly y Blazor Server proyectos y Actualizar Blazor WebAssembly proyectos .

Para que una aplicación independiente Blazor WebAssembly registrada en Azure Portal use el identificador de Microsoft Entra (ME-ID):

  • La aplicación requiere el https://graph.microsoft.com/User.Read ámbito:

    options.ProviderOptions.DefaultAccessTokenScopes
        .Add("https://graph.microsoft.com/User.Read");
    
  • En la hoja de Autenticación de registro de aplicaciones del portal Azure:

    1. Agregue la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicaciones de página única con el URI de redireccionamiento de la aplicación.
    3. Desactivar la concesión implícita para tokens de acceso y tokens de ID.

Para más información, consulte Protección de una aplicación ASP.NET Core Blazor WebAssembly independiente con Cuentas de Microsoft.

Aplicación Blazor WebAssembly independiente con Azure Active Directory B2C (AAD)

Siga las orientaciones de las secciones anteriores Actualizar Blazor WebAssembly y Blazor Server proyectos y Actualizar Blazor WebAssembly proyectos .

Para que una aplicación independiente Blazor WebAssembly registrada en el Azure Portal use Azure Active Directory (AAD) B2C:

  • La aplicación requiere los openid y offline_access ámbitos :

    options.ProviderOptions.DefaultAccessTokenScopes.Add("openid");
    options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
    
  • En la hoja de Autenticación de registro de aplicaciones del portal Azure:

    1. Agregue la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicaciones de página única con el URI de redireccionamiento de la aplicación.
    3. Desactivar la concesión implícita para tokens de acceso y tokens de ID.

Para más información, consulte Protección de una aplicación ASP.NET Core Blazor WebAssembly independiente con Azure Active Directory B2C.

Aplicación hospedada Blazor WebAssembly con microsoft Entra ID (ME-ID) o AAD B2C

Siga las orientaciones de las secciones anteriores Actualizar Blazor WebAssembly y Blazor Server proyectos y Actualizar Blazor WebAssembly proyectos .

El Client registro de aplicaciones de una solución alojada Blazor que utiliza AAD o AAD B2C para la autenticación de usuarios debe utilizar una configuración de la plataforma Azure Apps de aplicación de una sola página.

En la hoja de Client Autenticación de registro de aplicaciones del portal Azure:

  1. Agregue la configuración de la plataforma web.
  2. Agregue una configuración de plataforma de aplicaciones de página única con el URI de redireccionamiento de la aplicación.
  3. Desactivar la concesión implícita para tokens de acceso y tokens de ID.

Para más información, consulte:

Actualizar el proyecto Servidor de una solución Blazor alojada

Siga las instrucciones de las secciones anteriores:

Actualice el Server proyecto de una solución hospedada Blazor como una aplicación ASP.NET Core siguiendo las instrucciones generales de este artículo.

Además, Server los proyectos que autentican a los usuarios en aplicaciones cliente Blazor WebAssembly con Azure Active Directory (AAD) o B2C deben adoptar nuevos paquetes de Microsoft Identity v2.0:

Para AAD:

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

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

Para las referencias de paquete anteriores, determine las versiones del paquete para los {VERSION} marcadores de posición en NuGet.org:

Nota:

El SDK del Server proyecto en una solución alojada Blazor WebAssembly permaneceMicrosoft.NET.Sdk.Web:

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

Para más información, consulte:

Limpiar y recompilar la solución

Después de migrar la aplicación o la solución a .NET 5, limpie y recompile la aplicación o la solución. Si existen incompatibilidades de paquetes entre las nuevas referencias de paquete y los paquetes almacenados en caché:

  1. Borre las cachés de los paquetes NuGet ejecutando el siguiente dotnet nuget locals comando en un shell de comandos:

    dotnet nuget locals --clear all
    
  2. Limpie y recompile la aplicación o la solución.

Solución de problemas

Siga las instrucciones de solución de problemas al final del Blazor WebAssembly tema de seguridad que se aplica a la aplicación:

Aplicaciones de Blazor WebAssembly independientes:

Aplicaciones de Blazor WebAssembly hospedadas:

Cliente no autorizado para microsoft Entra ID (ME-ID)

Después de actualizar una Blazor WebAssembly aplicación que usa AAD para la autenticación, puede recibir el siguiente error en la devolución de llamada de inicio de sesión en la aplicación después de que el usuario inicie sesión con AAD:

Información: Error de autorización de Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]. No se cumplen estos requisitos: DenyAnonymousAuthorizationRequirement: se requiere un usuario autenticado.

Error de devolución de llamada de inicio de sesión de AAD:

  • Error: unauthorized_client
  • Description (Descripción): AADB2C90058: The provided application is not configured to allow public clients.

Para resolver el error:

  1. En Azure Portal, acceda al manifiesto de la aplicación.
  2. Defina el atributo allowPublicClient en null o true.

Actualizar Blazor una aplicación web progresiva (PWA)

Añade el siguiente elemento al archivo de proyecto de la aplicación PWA:

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

Si el proyecto wwwroot/index.html (Blazor WebAssembly) o Pages/_Host.cshtml (Blazor Server) contiene un elemento de hoja <link> de estilos de scoped.styles.css una versión preliminar anterior de la versión preliminar 5.0, quite la <link> etiqueta :

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

Actualizar Razor bibliotecas de clases (RCL)

Migre las bibliotecas de clases (RCL) Razor para aprovechar las nuevas API o las características que se presentan como parte de ASP.NET Core 5.0.

Para actualizar una RCL que tenga como destino los componentes:

  1. Actualice las siguientes propiedades en el archivo del proyecto :

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
    -     <TargetFramework>netstandard2.0</TargetFramework>
    -     <RazorLangVersion>3.0</RazorLangVersion>
    +     <TargetFramework>net5.0</TargetFramework>
      </PropertyGroup>
    
  2. Actualice otros paquetes a sus versiones más recientes. Las versiones más recientes se pueden encontrar en NuGet.org.

Para actualizar una instancia de RCL dirigida a MVC, actualice las siguientes propiedades en el archivo de proyecto:

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

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

Actualización de las referencias del paquete

En el archivo del proyecto, actualice cada microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*, y el atributo de referencia del paquete System.Net.Http.JsonVersion a la versión 5.0.0 o posterior. Por ejemplo:

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

Actualización de imágenes de Docker

En el caso de aplicaciones que usen Docker, actualice las instrucciones y scripts de DockerfileFROM. Use una imagen de base que incluya el entorno de ejecución de ASP.NET Core 5.0. Tenga en cuenta la siguiente docker pull diferencia de comandos entre ASP.NET Core 3.1 y 5.0:

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

Como parte del traslado a ".NET" como nombre del producto, las imágenes de Docker se movieron de los mcr.microsoft.com/dotnet/core repositorios a mcr.microsoft.com/dotnet. Para obtener más información, consulte dotnet/dotnet-docker#1939.

Cambios de enlace de modelos en ASP.NET Core MVC y Razor páginas

Los valores DateTime están modelados como horas UTC

En ASP.NET Core 3.1 y versiones anteriores, los valores DateTime estaban enlazados al modelo como hora local, donde el servidor determinó la zona horaria. DateTime Los valores enlazados del formato de entrada (JSON) y los DateTimeOffsetvalores se enlazaron como zonas horarias UTC.

En ASP.NET Core 5.0 y versiones posteriores, el enlace de modelos enlaza de forma coherente los DateTime valores con la zona horaria UTC.

Para conservar el comportamiento anterior, quite DateTimeModelBinderProvider en Startup.ConfigureServices:

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder reemplazar ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

Para agregar compatibilidad con los tipos de registro C# 9 de enlace de modelos, el ComplexTypeModelBinderProvider es:

  • Anotado como obsoleto.
  • Ya no está registrado de forma predeterminada.

Las aplicaciones que dependen de la presencia de ComplexTypeModelBinderProvider en laModelBinderProviders colección deben hacer referencia al nuevo proveedor de enlazador:

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

UseDatabaseErrorPage obsoleto

Las plantillas de ASP.NET Core 3.1 que incluyen una opción para las cuentas de usuario individuales generan una llamada a UseDatabaseErrorPage. UseDatabaseErrorPage ahora está obsoleto y debe reemplazarse por una combinación de AddDatabaseDeveloperPageExceptionFilter y UseMigrationsEndPoint, como se muestra en el código siguiente:

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

Para más información, consulte este problema de GitHub.

Módulo de ASP.NET Core (ANCM)

Si el módulo de ASP.NET Core (ANCM) no era un componente seleccionado cuando Visual Studio se instaló o si se instaló una versión anterior de ANCM en el sistema, descargue el instalador de agrupación de hospedaje de .NET Core más reciente (descarga directa) y ejecute el instalador. Para obtener más información, consulte Agrupación de hospedaje.

cambios en las referencias de paquetes que afectan a algunos paquetes NuGet

Con la migración de algunos Microsoft.Extensions.* paquetes NuGet del repositorio dotnet/extensions a dotnet/runtime , como se describe en Migración del contenido de dotnet/extensions a dotnet/runtime y dotnet/aspnetcore (aspnet/Announcements #411), se están aplicando cambios de empaquetado a algunos de los paquetes migrados. Estos cambios suelen dar lugar a cambios de espacio de nombres para la API de .NET.

Para investigar aún más las API para los cambios en el espacio de nombres de la aplicación al migrar a la versión 5.0, use el explorador de la API de .NET.

Migrar Microsoft.Identity. Web

En las páginas wiki siguientes se explica cómo migrar Microsoft.Identity. Web de ASP.NET Core 3.1 a 5.0:

Los tutoriales siguientes también explican la migración:

Revisar cambios importantes

Para conocer los cambios importantes de .NET Core 3.1 a .NET 5.0, consulte Cambios importantes para la migración de la versión 3.1 a la 5.0. ASP.NET Core y Entity Framework Core también se incluyen en la lista.