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
- Versión 16.8 o posterior de Visual Studio 2019 con la carga de trabajo Desarrollo web y ASP.NET
- SDK de .NET 5.0
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.
Acción recomendada
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.
En
wwwroot/index.htmlde una aplicación o de una aplicación, agregue un elemento al elemento para los Blazor WebAssemblyPages/_Host.cshtmlBlazor Server<link><head>estilos. En los siguientes<link>valores de atributo dehrefelemento, 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" />ClientProyecto de ejemplo de una Blazor WebAssembly solución hospedada:+<link href="BlazorSample.Client.styles.css" rel="stylesheet" />Incluya un nuevo espacio de nombres en el archivo de la
_Imports.razoraplicación para la virtualización de componentes, Microsoft.AspNetCore.Components.Web.Virtualization . Los archivos_Imports.razorsiguientes 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}.SharedBlazor 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}.SharedEn el componente ( ), rodea el marcado HTML del componente
MainLayoutcon un elemento que tiene un atributo establecido enShared/MainLayout.razor<div>classpage:<div class="page"> ... </div>Agregue los siguientes archivos a la
Sharedcarpeta :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; } }El archivo base
wwwroot/css/app.cssmás reciente de una aplicación o archivo de una aplicación incluye los estilos Blazor WebAssemblywwwroot/css/site.cssBlazor 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:
Actualice el SDK de
Microsoft.NET.Sdk.WebaMicrosoft.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
ClientBlazor hospedadas.Actualice las siguientes propiedades:
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <PropertyGroup> - <TargetFramework>netstandard2.1</TargetFramework> - <RazorLangVersion>3.0</RazorLangVersion> + <TargetFramework>net5.0</TargetFramework> </PropertyGroup>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" />Actualice otros paquetes a sus versiones más recientes. Las versiones más recientes se pueden encontrar en NuGet.org.
En
wwwroot/index.html, cambie el elemento que carga el componente a un elemento con un establecido enApp<div>idapp:-<app>Loading...</app> +<div id="app">Loading...</div>En
Program.Main( ), cambie la referencia al elemento a un selector CSSProgram.cs<app>agregando un hash a#él:-builder.RootComponents.Add<App>("app"); +builder.RootComponents.Add<App>("#app");En ( ), cambie un registro transitorio predeterminado a
Program.MainProgram.csconHttpClientá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) });En
Program.Main( ) de la aplicación de solucionesProgram.csClientBlazor hospedadas:- Opcionalmente, sustituya
builder.HostEnvironment.BaseAddresspor 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.- Opcionalmente, sustituya
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
openidoffline_accessámbitos y :options.ProviderOptions.DefaultAccessTokenScopes.Add("openid"); options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");En la hoja autenticación Azure Portal registro de aplicaciones:
- Quite la configuración de la plataforma web.
- Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
- 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:
- Quite la configuración de la plataforma web.
- Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
- 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
openidoffline_accessámbitos y :options.ProviderOptions.DefaultAccessTokenScopes.Add("openid"); options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");En la hoja autenticación Azure Portal registro de aplicaciones:
- Quite la configuración de la plataforma web.
- Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
- 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:
- Quite la configuración de la plataforma web.
- Agregue una configuración de plataforma de aplicación de página única con el URI de redirección de la aplicación.
- 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 hospedada Blazor WebAssembly de ASP.NET Core con Azure Active Directory
- Protección de una aplicación hospedada Blazor WebAssembly de ASP.NET Core con Azure Active Directory B2C
Actualización del proyecto Server de una solución Blazor hospedada
Siga las instrucciones de las secciones anteriores:
- Actualización Blazor WebAssembly y Blazor Server proyectos
- Actualizar Blazor WebAssembly proyectos
- La sección que se aplica al proveedor de la aplicación con Azure Active Directory:
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:
- Protección de una aplicación hospedada Blazor WebAssembly de ASP.NET Core con Azure Active Directory
- Protección de una aplicación hospedada Blazor WebAssembly de ASP.NET Core con Azure Active Directory B2C
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é:
Borre NuGet cachés de paquetes ejecutando el siguiente
dotnet nuget localscomando en un shell de comandos:dotnet nuget locals --clear allLimpie 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:
- Instrucciones generales para los proveedores de OIDC y la biblioteca de autenticación WebAssembly
- Cuentas de Microsoft
- Azure Active Directory (AAD)
- Azure Active Directory (AAD) B2C
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:
- En Azure Portal, acceda al manifiesto de la aplicación.
- Defina el atributo
allowPublicClientennullotrue.
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>
Eliminación del vínculo de hoja de estilos de aislamiento CSS de versión preliminar
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:
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>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.