Migración de ASP.NET Core 3.1 a .NET 5

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

Prerequisites

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

Si confía en un global.json archivo para tener como destino una versión específica del SDK de .NET, actualice la version propiedad a la versión del SDK de .NET 5 instalada. Por ejemplo:

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

Actualización de la plataforma de destino

Si actualiza un proyecto Blazor WebAssembly, pase a la sección Actualizar proyectos Blazor WebAssembly. Para cualquier otro tipo de proyecto de ASP.NET Core, actualice en el archivo del proyecto el Target Framework Moniker (TFM) 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 .NET 5.x hasta .NET 6

El cálculo de la precedencia de ruta cambió en el parche 5.0.1. Esto puede afectarle si ha definido rutas de captura o rutas con parámetros opcionales.

Comportamiento anterior

Con el comportamiento anterior 5.0.0 o versiones anteriores, las rutas con menor prioridad, como {*slug}, se coinciden antes de las rutas con mayor prioridad, como /customer/{id}.

Nuevo comportamiento

El nuevo comportamiento de la versión 5.0.1 o posterior coincide más estrechamente con el comportamiento de enrutamiento definido en ASP.NET aplicaciones core, donde el marco calcula y establece la prioridad de ruta para cada segmento primero y solo usa la longitud de la ruta para interrumpir 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.

Añada el atributo PreferExactMatches al componente Router en el archivo App.razor para habilitar el comportamiento correcto:

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

Cuando PreferExactMatches se establece en @true, la coincidencia de rutas da prioridad a las coincidencias exactas frente a las coincidencias con comodines.

Important

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.

Actualizar los proyectos Blazor WebAssembly y Blazor Server

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 aplicación Blazor WebAssembly o en Pages/_Host.cshtml de una aplicación Blazor Server, añada un elemento <link> al elemento <head> para los estilos. En los siguientes valores del atributo href del elemento <link>, el marcador de posición {ASSEMBLY NAME} es el nombre del ensamblado de la aplicación.

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

    Ejemplo independiente de Blazor WebAssembly o Blazor Server:

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

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

    +<link href="BlazorSample.Client.styles.css" rel="stylesheet" />
    
  2. Incluya un nuevo espacio de nombres en el archivo de importaciones de la aplicación (_Imports.razor) para la virtualización de componentes, Microsoft.AspNetCore.Components.Web.Virtualization. Los siguientes archivos importados muestran los espacios de nombres predeterminados en las aplicaciones generadas a partir de las plantillas de proyecto de Blazor. 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 componente MainLayout (Shared/MainLayout.razor), rodea el marcado HTML del componente con un elemento <div> con un atributo class 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;
    }
    

    Note

    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.

Actualizar proyectos Blazor WebAssembly

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

Para un proyecto Blazor WebAssembly, incluido el proyecto Client de una solución alojada Blazor, aplique los siguientes cambios en el archivo del 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">
    

    Note

    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 componente App por un elemento <div> con 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 predeterminado HttpClient para que sea de á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 aplicación Client de soluciones alojadas Blazor:

    • Opcionalmente, sustituya las direcciones base del cliente de cadena por builder.HostEnvironment.BaseAddress.
    • Cambie los registros con nombre de factoría de cliente transitorios a de á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 espacio de nombres 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 el portal de Azure use Microsoft Entra ID (ME-ID) para Cuentas de Microsoft:

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

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

    1. Elimine la configuración de la plataforma Web.
    2. Agregue una configuración de plataforma para 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 Microsoft Entra ID (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 ámbito https://graph.microsoft.com/User.Read:

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

    1. Elimine la configuración de la plataforma Web.
    2. Agregue una configuración de plataforma para aplicación de una sola página con el URI de redirección de la aplicación.
    3. Desactivar concesión implícita para tokens de acceso y tokens de ID.

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

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 portal de Azure pueda usar 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 sección Autenticación de Registro de aplicaciones del portal de Azure:

    1. Elimine la configuración de la plataforma Web.
    2. Añade una configuración de la plataforma de aplicación de una sola página con el URI de redireccionamiento de la aplicación.
    3. Desactivar 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 alojada 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 aplicación de una solución Blazor hospedada que utiliza AAD o AAD B2C para autenticar a los usuarios debe usar una configuración de la plataforma Aplicaciones de Azure de tipo Aplicación de una sola página.

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

  1. Elimine 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 concesión implícita para tokens de acceso y tokens de ID.

Para más información, consulte:

Actualizar el proyecto Server de una solución Blazor hospedada

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 para las aplicaciones cliente Blazor WebAssembly con Microsoft Entra ID (ME-ID) o B2C deben adoptar los nuevos paquetes 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 paquetes anteriores, determine en NuGet.org las versiones de los paquetes para los marcadores {VERSION}:

Note

El SDK del proyecto Server en una solución hospedada Blazor WebAssembly sigue siendo Microsoft.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.

Troubleshoot

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

Aplicaciones Blazor WebAssembly independientes:

Aplicaciones Blazor WebAssembly alojadas:

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

Después de actualizar una aplicación Blazor WebAssembly que usa AAD para la autenticación, puede aparecer el siguiente error durante la devolución de llamada de inicio de sesión a la aplicación después de que el usuario haya iniciado 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 retorno de llamada de inicio de sesión de AAD:

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

Para resolver el error:

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

Actualizar una Blazor 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 wwwroot/index.html (Blazor WebAssembly) o Pages/_Host.cshtml (Blazor Server) del proyecto contiene un elemento <link> de hoja de estilos para scoped.styles.css de una versión preliminar anterior de 5.0, quite la etiqueta <link>:

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

Actualizar Razor bibliotecas de clases (RCL)

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

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 base que incluya el entorno de ejecución de .NET 5. Tenga en cuenta la siguiente docker pull diferencia de comandos entre ASP.NET Core 3.1 y .NET 5:

- 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 en el enlace de modelo en ASP.NET Core MVC y Razor Pages

Los valores DateTime se enlazan al modelo como fechas y horas en UTC

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

En .NET 5 o posterior, el enlace de modelos une constantemente los valores de DateTime con la zona horaria UTC.

Para conservar el comportamiento anterior, quite DateTimeModelBinderProvider de 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>();

La función UseDatabaseErrorPage está obsoleta.

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 Hosting Bundle.

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 .NET 5, use el explorador de API de .NET.

Migrar Microsoft.Identity.Web

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

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

Cambios críticos

Use los artículos de Cambios importantes en .NET para buscar cambios importantes que se pueden aplicar al actualizar una aplicación a una versión más reciente de .NET.