Migración de ASP.NET Core 3.1 a 5.0

Por Scott Addie

En este artículo se explica cómo actualizar un proyecto ASP.NET Core 3.1 a ASP.NET Core 5.0.

Requisitos previos

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

Si confía en un archivo global.js para tener como destino una versión específica de SDK de .NET Core, actualice la propiedad a la versión del version SDK de .NET 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 ASP.NET Core proyecto, 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>

Eliminación bin de obj carpetas y

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

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

El cálculo de la prioridad de ruta cambió en ASP.NET Core versión de revisión 5.0.1. Esto puede afectar a usted si ha definido rutas o rutas catch-all con parámetros opcionales.

Comportamiento anterior

Con el comportamiento anterior en ASP.NET Core 5.0.0 o versiones anteriores, las rutas con menor precedencia, como , se comparan antes que las rutas con mayor {*slug} 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 las aplicaciones de ASP.NET Core, donde el marco calcula y establece primero la prioridad de ruta para cada segmento y solo usa la longitud de la ruta para interrumpir los lazos como criterio secundario.

Motivo del cambio

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

Agregue el PreferExactMatches atributo al componente en el archivo para participar en el comportamiento Router App.razor 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 establecerse explícitamente PreferExactMatches en @true .

La capacidad de establecer en PreferExactMatches @false o dejarla sin establecer solo se proporciona por compatibilidad con versiones anteriores.

Cuando se libera .NET 6, el enrutador siempre prefiere coincidencias exactas y PreferExactMatches la 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. Las secciones siguientes a esta sección proporcionan instrucciones adicionales específicas para hospedar modelos y tipos de aplicación. Aplique la guía de todas las secciones pertinentes a la aplicación.

  1. En wwwroot/index.html de una aplicación o de una aplicación, agregue un elemento al elemento para los Blazor WebAssembly Pages/_Host.cshtml Blazor Server <link> <head> estilos. En los siguientes <link> valores de atributo de href elemento, el marcador de posición es {ASSEMBLY NAME} 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 ejemplo de una Blazor WebAssembly solución hospedada:

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

    <div class="page">
    
        ...
    
    </div>
    
  4. Agregue 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 aplicación o archivo de una aplicación incluye los estilos Blazor WebAssembly wwwroot/css/site.css Blazor Server siguientes. Quite los estilos adicionales que dejan los estilos siguientes y los que haya agregado a la aplicación.

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

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

Actualización de proyectos de Blazor WebAssembly

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

Para un Blazor WebAssembly proyecto, incluido el Client proyecto de una solución Blazor hospedada, aplique los siguientes cambios al 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 los proyectos Blazor WebAssembly independientes y a los proyectos de soluciones Client Blazor hospedadas.

  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 de 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 a un elemento con un establecido en App <div> id app :

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

    -builder.RootComponents.Add<App>("app");
    +builder.RootComponents.Add<App>("#app");
    
  7. En ( ), cambie un registro transitorio predeterminado a Program.Main Program.cs con HttpClient á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 ( ) de la aplicación de soluciones Program.cs Client Blazor hospedadas:

    • Opcionalmente, sustituya builder.HostEnvironment.BaseAddress por 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 {APP NAMESPACE} posición es el espacio de nombres de la aplicación.

Aplicación Blazor WebAssembly independiente con cuentas Microsoft

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

Para una aplicación Blazor WebAssembly independiente registrada en el Azure Portal usar Azure Active Directory (AAD) para cuentas Microsoft:

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

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

    1. Quite la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
    3. Deshabilite la concesión implícita para tokens de acceso y tokens de identificador.

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

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

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

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

  • 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 autenticación Azure Portal registro de aplicaciones:

    1. Quite la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
    3. Deshabilite la concesión implícita para tokens de acceso y tokens de identificador.

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

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

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

Para una aplicación Blazor WebAssembly independiente registrada en la Azure Portal usar Azure Active Directory (AAD) B2C:

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

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

    1. Quite la configuración de la plataforma web.
    2. Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
    3. Deshabilite la concesión implícita para tokens de acceso y tokens de identificador.

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

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

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

El registro de aplicaciones de una solución hospedada que usa AAD o AAD B2C para la autenticación de usuario debe usar una configuración de la plataforma azure apps de aplicación Client Blazor de página única.

En la hoja autenticación Azure Portal Client registro de aplicaciones:

  1. Quite la configuración de la plataforma web.
  2. Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
  3. Deshabilite la concesión implícita para tokens de acceso y tokens de identificador.

Para más información, consulte:

Actualización del proyecto Server de una solución Blazor hospedada

Siga las instrucciones de las secciones anteriores:

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

Además, los proyectos que autentican a los usuarios en aplicaciones cliente con Azure Active Directory (AAD) o B2C deben adoptar nuevos Server Blazor WebAssembly 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 marcadores de posición {VERSION} en NuGet.org:

Nota

El SDK del proyecto Server en una solución Blazor WebAssembly hospedada sigue siendo Microsoft.NET.Sdk.Web :

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

Para más información, consulte:

Limpieza y recompilación de 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 entre las nuevas referencias de paquete y los paquetes almacenados en caché:

  1. Borre NuGet cachés de paquetes 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 tema de seguridad que se aplica a Blazor WebAssembly la aplicación:

Aplicaciones de Blazor WebAssembly independientes:

Aplicaciones de Blazor WebAssembly hospedadas:

Cliente no autorizado para Azure Active Directory (AAD)

Después de actualizar una 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 a la aplicación después de que el usuario inicie sesión Blazor WebAssembly 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 una Blazor aplicación web progresiva (PWA)

Agregue el siguiente elemento al archivo PWA proyecto de la aplicación:

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

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

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

Actualización Razor de bibliotecas de clases (RCL)

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

Para actualizar una RCL que tiene como destino 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 RCL destinada a MVC, actualice las siguientes propiedades en el archivo del 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 de proyecto, actualice cada Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*, Microsoft.Extensions.*ySystem.Net.Http.Jsen el atributo de referencia de paquete a Version 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 las aplicaciones que usan Docker, actualice las instrucciones y los scripts de FROM Dockerfile. Use una imagen base que incluya el ASP.NET Core runtime 5.0. Tenga en cuenta la docker pull siguiente 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 han movido de los mcr.microsoft.com/dotnet/core repositorios a mcr.microsoft.com/dotnet . Para más información, consulte dotnet/dotnet-docker#1939.

Cambios de enlace de modelos en ASP.NET Core MVC y Razor Pages

Los valores DateTime están enlazados al modelo como horas UTC

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

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

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

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

ComplexObjectModelBinderProvider \ ComplexObjectModelBinder replace ComplexTypeModelBinderProvider \ ComplexTypeModelBinder

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

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

Las aplicaciones que se basan en la presencia de ComplexTypeModelBinderProvider en la colección deben hacer referencia al nuevo proveedor de ModelBinderProviders enlazador:

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

UseDatabaseErrorPage obsoleto

Las ASP.NET Core 3.1 que incluyen una opción para cuentas de usuario individuales generan una llamada a UseDatabaseErrorPage . UseDatabaseErrorPage ahora está obsoleto y debe reemplazarse por una combinación de AddDatabaseDeveloperPageExceptionFilter y , como se muestra en el código UseMigrationsEndPoint 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.

Revisión de cambios importantes

Para ver 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.