Migración de ASP.NET Core 2.2 a 3.0Migrate from ASP.NET Core 2.2 to 3.0

Por Scott Addie y Rick AndersonBy Scott Addie and Rick Anderson

En este artículo se explica cómo actualizar un proyecto ASP.NET Core 2.2 existente a ASP.NET Core 3.0.This article explains how to update an existing ASP.NET Core 2.2 project to ASP.NET Core 3.0. Puede resultar útil crear un nuevo proyecto ASP.NET Core 3.0 para:It might be helpful to create a new ASP.NET Core 3.0 project to:

  • Compare con el ASP.NET Core 2.2.Compare with the ASP.NET Core 2.2 code.
  • Copie los cambios pertinentes en el ASP.NET Core 3.0.Copy the relevant changes to your ASP.NET Core 3.0 project.

Requisitos previosPrerequisites

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

Si la solución se basa en un archivo global.js para tener como destino una versión específica de SDK de .NET Core, actualice su propiedad a la version versión 3.0 instalada en el equipo:If your solution relies upon a global.json file to target a specific .NET Core SDK version, update its version property to the 3.0 version installed on your machine:

{
  "sdk": {
    "version": "3.0.100"
  }
}

Actualización del archivo de proyectoUpdate the project file

Actualización de la plataforma de destinoUpdate the Target Framework

ASP.NET Core 3.0 y versiones posteriores solo se ejecutan en .NET Core.ASP.NET Core 3.0 and later only run on .NET Core. Establezca el Moniker de la plataforma de destino (TFM) en netcoreapp3.0 :Set the Target Framework Moniker (TFM) to netcoreapp3.0:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

Eliminación de referencias de paquete obsoletasRemove obsolete package references

No se produce un gran número de paquetes NuGet para ASP.NET Core 3.0.A large number of NuGet packages aren't produced for ASP.NET Core 3.0. Estas referencias de paquete deben quitarse del archivo del proyecto.Such package references should be removed from your project file. Considere el siguiente archivo de proyecto para una ASP.NET web core 2.2:Consider the following project file for an ASP.NET Core 2.2 web app:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

El archivo de proyecto actualizado para ASP.NET Core 3.0:The updated project file for ASP.NET Core 3.0:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
  </PropertyGroup>

</Project>

Archivo de proyecto ASP.NET Core 3.0 actualizado:The updated ASP.NET Core 3.0 project file:

  • En <PropertyGroup>:In the <PropertyGroup>:

    • Actualiza el TFM a netcoreapp3.0Updates the TFM to netcoreapp3.0
    • Quita el <AspNetCoreHostingModel> elemento .Removes the <AspNetCoreHostingModel> element. Para obtener más información, vea Modelo de hospedaje en proceso en este documento.For more information, see In-process hosting model in this document.
  • En <ItemGroup>:In the <ItemGroup>:

    • Microsoft.AspNetCore.App se quita.Microsoft.AspNetCore.App is removed. Para obtener más información, vea Referencia de Framework en este documento.For more information, see Framework reference in this document.
    • Microsoft.AspNetCore.Razor.Design se quita y en la siguiente lista de paquetes ya no se generan.Microsoft.AspNetCore.Razor.Design is removed and in the following list of packages no longer being produced.

Para ver la lista completa de paquetes que ya no se generan, seleccione la siguiente lista de expansión:To see the full list of packages that are no longer produced, select the following expand list:

Haga clic para expandir la lista de paquetes que ya no se generan.Click to expand the list of packages no longer being produced
  • Microsoft.AspNetCoreMicrosoft.AspNetCore
  • Microsoft.AspNetCore.AllMicrosoft.AspNetCore.All
  • Microsoft.AspNetCore.AppMicrosoft.AspNetCore.App
  • Microsoft.AspNetCore.AntiforgeryMicrosoft.AspNetCore.Antiforgery
  • Microsoft.AspNetCore.AuthenticationMicrosoft.AspNetCore.Authentication
  • Microsoft.AspNetCore.Authentication.AbstractionsMicrosoft.AspNetCore.Authentication.Abstractions
  • Microsoft.AspNetCore.Authentication. Cookie sMicrosoft.AspNetCore.Authentication.Cookies
  • Microsoft.AspNetCore.Authentication.CoreMicrosoft.AspNetCore.Authentication.Core
  • Microsoft.AspNetCore.Authentication.OAuthMicrosoft.AspNetCore.Authentication.OAuth
  • Microsoft.AspNetCore.Authorization.PolicyMicrosoft.AspNetCore.Authorization.Policy
  • Microsoft.AspNetCore. Cookie PolíticaMicrosoft.AspNetCore.CookiePolicy
  • Microsoft.AspNetCore.CorsMicrosoft.AspNetCore.Cors
  • Microsoft.AspNetCore.DiagnosticsMicrosoft.AspNetCore.Diagnostics
  • Microsoft.AspNetCore.Diagnostics.HealthChecksMicrosoft.AspNetCore.Diagnostics.HealthChecks
  • Microsoft.AspNetCore.HostFilteringMicrosoft.AspNetCore.HostFiltering
  • Microsoft.AspNetCore.HostingMicrosoft.AspNetCore.Hosting
  • Microsoft.AspNetCore.Hosting.AbstractionsMicrosoft.AspNetCore.Hosting.Abstractions
  • Microsoft.AspNetCore.Hosting.Server.AbstractionsMicrosoft.AspNetCore.Hosting.Server.Abstractions
  • Microsoft.AspNetCore.HttpMicrosoft.AspNetCore.Http
  • Microsoft.AspNetCore.Http.AbstractionsMicrosoft.AspNetCore.Http.Abstractions
  • Microsoft.AspNetCore.Http.ConnectionsMicrosoft.AspNetCore.Http.Connections
  • Microsoft.AspNetCore.Http.ExtensionsMicrosoft.AspNetCore.Http.Extensions
  • Microsoft.AspNetCore.HttpOverridesMicrosoft.AspNetCore.HttpOverrides
  • Microsoft.AspNetCore.HttpsPolicyMicrosoft.AspNetCore.HttpsPolicy
  • Microsoft.AspNetCore.IdentityMicrosoft.AspNetCore.Identity
  • Microsoft.AspNetCore.LocalizationMicrosoft.AspNetCore.Localization
  • Microsoft.AspNetCore.Localization.RoutingMicrosoft.AspNetCore.Localization.Routing
  • Microsoft.AspNetCore.MvcMicrosoft.AspNetCore.Mvc
  • Microsoft.AspNetCore.Mvc.AbstractionsMicrosoft.AspNetCore.Mvc.Abstractions
  • Microsoft.AspNetCore.Mvc.AnalyzersMicrosoft.AspNetCore.Mvc.Analyzers
  • Microsoft.AspNetCore.Mvc.ApiExplorerMicrosoft.AspNetCore.Mvc.ApiExplorer
  • Microsoft.AspNetCore.Mvc.Api.AnalyzersMicrosoft.AspNetCore.Mvc.Api.Analyzers
  • Microsoft.AspNetCore.Mvc.CoreMicrosoft.AspNetCore.Mvc.Core
  • Microsoft.AspNetCore.Mvc.CorsMicrosoft.AspNetCore.Mvc.Cors
  • Microsoft.AspNetCore.Mvc.DataAnnotationsMicrosoft.AspNetCore.Mvc.DataAnnotations
  • Microsoft.AspNetCore.Mvc.Formatters.JsonMicrosoft.AspNetCore.Mvc.Formatters.Json
  • Microsoft.AspNetCore.Mvc.Formatters.XmlMicrosoft.AspNetCore.Mvc.Formatters.Xml
  • Microsoft.AspNetCore.Mvc.LocalizationMicrosoft.AspNetCore.Mvc.Localization
  • Microsoft.AspNetCore.Mvc.RazorMicrosoft.AspNetCore.Mvc.Razor
  • Microsoft.AspNetCore.Mvc. Razor . ViewCompilationMicrosoft.AspNetCore.Mvc.Razor.ViewCompilation
  • Microsoft.AspNetCore.Mvc. Razor PáginasMicrosoft.AspNetCore.Mvc.RazorPages
  • Microsoft.AspNetCore.Mvc.TagHelpersMicrosoft.AspNetCore.Mvc.TagHelpers
  • Microsoft.AspNetCore.Mvc.ViewFeaturesMicrosoft.AspNetCore.Mvc.ViewFeatures
  • Microsoft.AspNetCore.RazorMicrosoft.AspNetCore.Razor
  • Microsoft.AspNetCore. Razor . EjecuciónMicrosoft.AspNetCore.Razor.Runtime
  • Microsoft.AspNetCore. Razor . DiseñoMicrosoft.AspNetCore.Razor.Design
  • Microsoft.AspNetCore.ResponseCachingMicrosoft.AspNetCore.ResponseCaching
  • Microsoft.AspNetCore.ResponseCaching.AbstractionsMicrosoft.AspNetCore.ResponseCaching.Abstractions
  • Microsoft.AspNetCore.ResponseCompressionMicrosoft.AspNetCore.ResponseCompression
  • Microsoft.AspNetCore.RewriteMicrosoft.AspNetCore.Rewrite
  • Microsoft.AspNetCore.RoutingMicrosoft.AspNetCore.Routing
  • Microsoft.AspNetCore.Routing.AbstractionsMicrosoft.AspNetCore.Routing.Abstractions
  • Microsoft.AspNetCore.Server.HttpSysMicrosoft.AspNetCore.Server.HttpSys
  • Microsoft.AspNetCore.Server.IISMicrosoft.AspNetCore.Server.IIS
  • Microsoft.AspNetCore.Server.IISIntegrationMicrosoft.AspNetCore.Server.IISIntegration
  • Microsoft.AspNetCore.Server.KestrelMicrosoft.AspNetCore.Server.Kestrel
  • Microsoft.AspNetCore.Server. Kestrel . NúcleoMicrosoft.AspNetCore.Server.Kestrel.Core
  • Microsoft.AspNetCore.Server. Kestrel . HttpsMicrosoft.AspNetCore.Server.Kestrel.Https
  • Microsoft.AspNetCore.Server. Kestrel . Transport.AbstractionsMicrosoft.AspNetCore.Server.Kestrel.Transport.Abstractions
  • Microsoft.AspNetCore.Server. Kestrel . Transport.SocketsMicrosoft.AspNetCore.Server.Kestrel.Transport.Sockets
  • Microsoft.AspNetCore.SessionMicrosoft.AspNetCore.Session
  • Microsoft.AspNetCore.SignalRMicrosoft.AspNetCore.SignalR
  • Microsoft.AspNetCore. SignalR . NúcleoMicrosoft.AspNetCore.SignalR.Core
  • Microsoft.AspNetCore.StaticFilesMicrosoft.AspNetCore.StaticFiles
  • Microsoft.AspNetCore.WebSocketsMicrosoft.AspNetCore.WebSockets
  • Microsoft.AspNetCore.WebUtilitiesMicrosoft.AspNetCore.WebUtilities
  • Microsoft.Net.Http.Headers Microsoft.Net.Http.Headers

Revisión de cambios importantesReview breaking changes

Revisión de cambios importantesReview breaking changes

Referencia del marcoFramework reference

Las características de ASP.NET Core que estaban disponibles a través de uno de los paquetes enumerados anteriormente están disponibles como parte del Microsoft.AspNetCore.App marco compartido.Features of ASP.NET Core that were available through one of the packages listed above are available as part of the Microsoft.AspNetCore.App shared framework. El marco compartido es el conjunto de ensamblados (archivos .dll) que se instalan en la máquina e incluye un componente de entorno de ejecución y un paquete de destino.The shared framework is the set of assemblies (.dll files) that are installed on the machine and includes a runtime component and a targeting pack. Para más información, consulte este artículo sobre el marco de trabajo compartido.For more information, see The shared framework.

  • Los proyectos que tienen como destino el SDK de Microsoft.NET.Sdk.Web hacen referencia implícitamente al marco Microsoft.AspNetCore.App.Projects that target the Microsoft.NET.Sdk.Web SDK implicitly reference the Microsoft.AspNetCore.App framework.

    No se requieren referencias adicionales para estos proyectos:No additional references are required for these projects:

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
        ...
    </Project>
    
  • Los proyectos que Microsoft.NET.Sdk tienen como destino o SDK deben agregar un explícito a Microsoft.NET.Sdk.Razor FrameworkReference Microsoft.AspNetCore.App :Projects that target Microsoft.NET.Sdk or Microsoft.NET.Sdk.Razor SDK, should add an explicit FrameworkReference to Microsoft.AspNetCore.App:

    <Project Sdk="Microsoft.NET.Sdk.Razor">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
        ...
    </Project>
    

Compilaciones dependientes del marco de trabajo con DockerFramework-dependent builds using Docker

Las compilaciones dependientes del marco de trabajo de las aplicaciones de consola que usan un paquete que depende del marco compartido ASP.NET Core pueden producir el siguiente error en tiempo de ejecución:Framework-dependent builds of console apps that use a package that depends on the ASP.NET Core shared framework may give the following runtime error:

It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.App', version '3.0.0' was not found.
  - No frameworks were found.

Microsoft.AspNetCore.Appes el marco compartido que contiene el entorno de ejecución ASP.NET Core y solo está presente en la imagen de Docker dotnet/core/aspnet.Microsoft.AspNetCore.App is the shared framework containing the ASP.NET Core runtime and is only present on the dotnet/core/aspnet Docker image. El SDK 3.0 reduce el tamaño de las compilaciones dependientes del marco mediante ASP.NET Core al no incluir copias duplicadas de las bibliotecas que están disponibles en el marco compartido.The 3.0 SDK reduces the size of framework-dependent builds using ASP.NET Core by not including duplicate copies of libraries that are available in the shared framework. Se trata de un ahorro potencial de hasta 18 MB, pero requiere que el entorno de ejecución de ASP.NET Core esté presente o instalado para ejecutar la aplicación.This is a potential savings of up to 18 MB, but it requires that the ASP.NET Core runtime be present / installed to run the app.

Para determinar si la aplicación tiene una dependencia (directa o indirecta) en el marco compartido de ASP.NET Core, examine elruntimeconfig.jsen el archivo generado durante una compilación o publicación de la aplicación.To determine if the app has a dependency (either direct or indirect) on the ASP.NET Core shared framework, examine the runtimeconfig.json file generated during a build/publish of your app. El siguiente archivo JSON muestra una dependencia en el marco compartido ASP.NET Core:The following JSON file shows a dependency on the ASP.NET Core shared framework:

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.0",
    "framework": {
      "name": "Microsoft.AspNetCore.App",
      "version": "3.0.0"
    },
    "configProperties": {
      "System.GC.Server": true
    }
  }
}

Si la aplicación usa Docker, use una imagen base que incluya ASP.NET Core 3.0.If your app is using Docker, use a base image that includes ASP.NET Core 3.0. Por ejemplo, docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0.For example, docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0.

Agregar referencias de paquete para ensamblados quitadosAdd package references for removed assemblies

ASP.NET Core 3.0 quita algunos ensamblados que anteriormente formaban parte de la referencia Microsoft.AspNetCore.App del paquete.ASP.NET Core 3.0 removes some assemblies that were previously part of the Microsoft.AspNetCore.App package reference. Para visualizar qué ensamblados se quitaron, compare las dos carpetas del marco compartido.To visualize which assemblies were removed, compare the two shared framework folders. Por ejemplo, una comparación de las versiones 2.2.7 y 3.0.0:For example, a comparison of versions 2.2.7 and 3.0.0:

comparación de ensamblados de marco compartido

Para seguir usando las características proporcionadas por los ensamblados quitados, haga referencia a las versiones 3.0 de los paquetes correspondientes:To continue using features provided by the removed assemblies, reference the 3.0 versions of the corresponding packages:

Cambios de inicioStartup changes

En la imagen siguiente se muestran las líneas eliminadas y modificadas en una aplicación web ASP.NET Core 2.2 Razor Pages:The following image shows the deleted and changed lines in an ASP.NET Core 2.2 Razor Pages Web app:

las líneas eliminadas y modificadas en ASP.NET Core 2.2 Razor Aplicación web

En la imagen anterior, el código eliminado se muestra en rojo.In the preceding image, deleted code is shown in red. El código eliminado no muestra el código cookie de opciones, que se eliminó antes de comparar los archivos.The deleted code doesn't show cookie options code, which was deleted prior to comparing the files.

En la imagen siguiente se muestran las líneas agregadas y modificadas en una aplicación web ASP.NET Core 3.0 Razor Pages:The following image shows the added and changed lines in an ASP.NET Core 3.0 Razor Pages Web app:

las líneas agregadas y modificadas en ASP.NET Core 3.0 Razor Aplicación web

En la imagen anterior, el código agregado se muestra en verde.In the preceding image, added code is shown in green. Para obtener información sobre los cambios siguientes:For information on the following changes:

Compatibilidad con analizadoresAnalyzer support

Los proyectos que tienen como destino los analizadores de referencia implícita se incluye anteriormente como parte del Microsoft.NET.Sdk.Web paquete Microsoft.AspNetCore.Mvc.Analyzers.Projects that target Microsoft.NET.Sdk.Web implicitly reference analyzers previously shipped as part of the Microsoft.AspNetCore.Mvc.Analyzers package. No se requieren referencias adicionales para habilitar estas.No additional references are required to enable these.

Si la aplicación usa analizadores de API enviados previamente mediante el paquete Microsoft.AspNetCore.Mvc.Api.Analyzers, edite el archivo de proyecto para hacer referencia a los analizadores incluidos como parte del SDK web de .NET Core:If your app uses API analyzers previously shipped using the Microsoft.AspNetCore.Mvc.Api.Analyzers package, edit your project file to reference the analyzers shipped as part of the .NET Core Web SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <IncludeOpenAPIAnalyzers>true</IncludeOpenAPIAnalyzers>
    </PropertyGroup>

    ...
</Project>

Razor Biblioteca de clasesRazor Class Library

Razor Los proyectos de biblioteca de clases que proporcionan componentes de interfaz de usuario para MVC deben establecer AddRazorSupportForMvc la propiedad en el archivo de proyecto:Razor Class Library projects that provide UI components for MVC must set the AddRazorSupportForMvc property in the project file:

<PropertyGroup>
  <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
</PropertyGroup>

Modelo de hospedaje en procesoIn-process hosting model

Los proyectos se de forma predeterminada en el modelo de hospedaje en proceso ASP.NET Core 3.0 o posterior.Projects default to the in-process hosting model in ASP.NET Core 3.0 or later. Opcionalmente, puede quitar la <AspNetCoreHostingModel> propiedad en el archivo de proyecto si su valor es InProcess .You may optionally remove the <AspNetCoreHostingModel> property in the project file if its value is InProcess.

Kestrel

ConfiguraciónConfiguration

Migrar Kestrel la configuración al generador de host web proporcionado por ConfigureWebHostDefaults (Program.cs):Migrate Kestrel configuration to the web host builder provided by ConfigureWebHostDefaults (Program.cs):

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Si la aplicación crea el host manualmente con en ConfigureWebHost lugar de , llame a en el generador de host ConfigureWebHostDefaults UseKestrel web:If the app creates the host manually with ConfigureWebHost instead of ConfigureWebHostDefaults, call UseKestrel on the web host builder:

public static void Main(string[] args)
{
    var host = new HostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder.UseKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
}

El middleware de conexión reemplaza a los adaptadores de conexiónConnection Middleware replaces Connection Adapters

Los adaptadores de conexión ( Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter ) se han quitado de Kestrel .Connection Adapters (Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal.IConnectionAdapter) have been removed from Kestrel. Reemplace los adaptadores de conexión por middleware de conexión.Replace Connection Adapters with Connection Middleware. El middleware de conexión es similar al middleware HTTP en la canalización ASP.NET Core, pero para las conexiones de nivel inferior.Connection Middleware is similar to HTTP Middleware in the ASP.NET Core pipeline but for lower-level connections. HTTPS y registro de conexión:HTTPS and connection logging:

  • Se han movido de adaptadores de conexión a middleware de conexión.Have been moved from Connection Adapters to Connection Middleware.
  • Estos métodos de extensión funcionan como en versiones anteriores de ASP.NET Core.These extension methods work as in previous versions of ASP.NET Core.

Para obtener más información, vea el ejemplo TlsFilterConnectionHandler en la sección ListenOptions.Protocols del Kestrel artículo.For more information, see the TlsFilterConnectionHandler example in the ListenOptions.Protocols section of the Kestrel article.

Las abstracciones de transporte se mueven y se hacen públicasTransport abstractions moved and made public

La Kestrel capa de transporte se ha expuesto como una interfaz pública en Connections.Abstractions .The Kestrel transport layer has been exposed as a public interface in Connections.Abstractions. Como parte de estas actualizaciones:As part of these updates:

  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions y se han quitado los tipos asociados.Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions and associated types have been removed.
  • NoDelay se ha movido de ListenOptions a las opciones de transporte.NoDelay was moved from ListenOptions to the transport options.
  • Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.SchedulingMode se quitó de KestrelServerOptions .Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal.SchedulingMode was removed from KestrelServerOptions.

Para más información, consulte los siguientes recursos de GitHub:For more information, see the following GitHub resources:

Kestrel Encabezados de finalizador de solicitudKestrel Request trailer headers

Para las aplicaciones destinadas a versiones anteriores de ASP.NET Core:For apps that target earlier versions of ASP.NET Core:

  • Kestrel agrega encabezados de finalizador fragmentados HTTP/1.1 a la colección de encabezados de solicitud.Kestrel adds HTTP/1.1 chunked trailer headers into the request headers collection.
  • Los finalizadores están disponibles después de que el cuerpo de la solicitud se lea hasta el final.Trailers are available after the request body is read to the end.

Esto provoca algunas preocupaciones sobre la ambigüedad entre encabezados y finalizadores, por lo que los finalizadores se han movido a una nueva colección ( RequestTrailerExtensions ) en la versión 3.0.This causes some concerns about ambiguity between headers and trailers, so the trailers have been moved to a new collection (RequestTrailerExtensions) in 3.0.

Los finalizadores de solicitudes HTTP/2 son:HTTP/2 request trailers are:

  • No disponible en ASP.NET Core 2.2.Not available in ASP.NET Core 2.2.
  • Disponible en 3.0 como RequestTrailerExtensions .Available in 3.0 as RequestTrailerExtensions.

Hay nuevos métodos de extensión de solicitud para acceder a estos finalizadores.New request extension methods are present to access these trailers. Al igual que con HTTP/1.1, los finalizadores están disponibles después de que el cuerpo de la solicitud se lea hasta el final.As with HTTP/1.1, trailers are available after the request body is read to the end.

Para la versión 3.0, están disponibles los RequestTrailerExtensions métodos siguientes:For the 3.0 release, the following RequestTrailerExtensions methods are available:

  • GetDeclaredTrailers: obtiene el encabezado Trailer de solicitud que enumera los finalizadores que se esperan después del cuerpo.GetDeclaredTrailers: Gets the request Trailer header that lists which trailers to expect after the body.
  • SupportsTrailers: indica si la solicitud admite la recepción de encabezados de finalizador.SupportsTrailers: Indicates if the request supports receiving trailer headers.
  • CheckTrailersAvailable: comprueba si la solicitud admite finalizadores y si están disponibles para leerse.CheckTrailersAvailable: Checks if the request supports trailers and if they're available to be read. Esta comprobación no supone que hay finalizadores para leer.This check doesn't assume that there are trailers to read. Es posible que no haya ningún finalizador para leer aunque true este método lo devuelva.There might be no trailers to read even if true is returned by this method.
  • GetTrailer: obtiene el encabezado final solicitado de la respuesta.GetTrailer: Gets the requested trailing header from the response. Compruebe SupportsTrailers antes de llamar a o si la solicitud no admite GetTrailer NotSupportedException encabezados finales.Check SupportsTrailers before calling GetTrailer, or a NotSupportedException may occur if the request doesn't support trailing headers.

Para obtener más información, vea Put request trailers in a separate collection (dotnet/AspNetCore #10410)(Colocar finalizadores de solicitudes en una colección independiente [dotnet/AspNetCore #10410]).For more information, see Put request trailers in a separate collection (dotnet/AspNetCore #10410).

AllowSynchronousIO deshabilitadoAllowSynchronousIO disabled

AllowSynchronousIO habilita o deshabilita las API de E/S sincrónicas, como HttpRequest.Body.Read HttpResponse.Body.Write , y Stream.Flush .AllowSynchronousIO enables or disables synchronous I/O APIs, such as HttpRequest.Body.Read, HttpResponse.Body.Write, and Stream.Flush. Estas API son un origen de la escasez de subprocesos que conduce a bloqueos de aplicaciones.These APIs are a source of thread starvation leading to app crashes. En la versión 3.0, AllowSynchronousIO se ha deshabilitado de manera predeterminada.In 3.0, AllowSynchronousIO is disabled by default. Para obtener más información, vea la sección E/S sincrónica del Kestrel artículo.For more information, see the Synchronous I/O section in the Kestrel article.

Si se necesita E/S sincrónica, se puede habilitar configurando la opción en el servidor que se usa (al llamar a , por ejemplo, si AllowSynchronousIO ConfigureKestrel se usa Kestrel ).If synchronous I/O is needed, it can be enabled by configuring the AllowSynchronousIO option on the server being used (when calling ConfigureKestrel, for example, if using Kestrel). Tenga en cuenta que todos los servidores Kestrel (, HttpSys, TestServer, etc.) tienen su propia opción que no afectará AllowSynchronousIO a otros servidores.Note that servers (Kestrel, HttpSys, TestServer, etc.) all have their own AllowSynchronousIO option that won't affect other servers. La E/S sincrónica se puede habilitar para todos los servidores por solicitud mediante la IHttpBodyControlFeature.AllowSynchronousIO opción :Synchronous I/O can be enabled for all servers on a per-request basis using the IHttpBodyControlFeature.AllowSynchronousIO option:

var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();

if (syncIOFeature != null)
{
    syncIOFeature.AllowSynchronousIO = true;
}

Si tiene problemas con implementaciones u otras secuencias que llaman a api sincrónicas en TextWriter Dispose,llame a la nueva API en DisposeAsync su lugar.If you have trouble with TextWriter implementations or other streams that call synchronous APIs in Dispose, call the new DisposeAsync API instead.

Para obtener más información, vea [Anuncio] AllowSynchronousIO deshabilitadoen todos los servidores (dotnet/AspNetCore #7644).For more information, see [Announcement] AllowSynchronousIO disabled in all servers (dotnet/AspNetCore #7644).

Almacenamiento en búfer del formateador de salidaOutput formatter buffering

Newtonsoft.Jsen los formateadoresde salida basados en , y XmlSerializer solo DataContractSerializer admiten la serialización sincrónica.Newtonsoft.Json, XmlSerializer, and DataContractSerializer based output formatters only support synchronous serialization. Para permitir que estos formateadores funcionen con las restricciones AllowSynchronousIO del servidor, MVC almacena en búfer la salida de estos formateadores antes de escribir en el disco.To allow these formatters to work with the AllowSynchronousIO restrictions of the server, MVC buffers the output of these formatters before writing to disk. Como resultado del almacenamiento en búfer, MVC incluirá el encabezado Content-Length al responder mediante estos formateadores.As a result of buffering, MVC will include the Content-Length header when responding using these formatters.

System.Text.Json admite la serialización asincrónica y, por consiguiente, System.Text.Json el formateador basado no almacena en búfer.System.Text.Json supports asynchronous serialization and consequently the System.Text.Json based formatter does not buffer. Considere la posibilidad de usar este formateador para mejorar el rendimiento.Consider using this formatter for improved performance.

Para deshabilitar el almacenamiento en búfer, las aplicaciones pueden SuppressOutputFormatterBuffering configurar en su inicio:To disable buffering, applications can configure SuppressOutputFormatterBuffering in their startup:

services.AddControllers(options => options.SuppressOutputFormatterBuffering = true)

Tenga en cuenta que esto puede dar lugar a que la aplicación produce una excepción en tiempo de ejecución si AllowSynchronousIO no está también configurada.Note that this may result in the application throwing a runtime exception if AllowSynchronousIO isn't also configured.

Microsoft.AspNetCore.Server. Kestrel . Ensamblado Https quitadoMicrosoft.AspNetCore.Server.Kestrel.Https assembly removed

En ASP.NET Core 2.1, el contenido de Microsoft.AspNetCore.Server. Kestrel.Https.dll se movió a Microsoft.AspNetCore.Server. Kestrel.Core.dll.In ASP.NET Core 2.1, the contents of Microsoft.AspNetCore.Server.Kestrel.Https.dll were moved to Microsoft.AspNetCore.Server.Kestrel.Core.dll. Se trata de una actualización sin cambios con TypeForwardedTo atributos.This was a non-breaking update using TypeForwardedTo attributes. Para la versión 3.0, se han quitado el ensamblado .Https.dllmicrosoft.AspNetCore.Server. Kestrel vacío y el paquete NuGet.For 3.0, the empty Microsoft.AspNetCore.Server.Kestrel.Https.dll assembly and the NuGet package have been removed.

Bibliotecas que hacen referencia a Microsoft.AspNetCore.Server. Kestrel Https debe actualizar ASP.NET Core a 2.1 o posterior.Libraries referencing Microsoft.AspNetCore.Server.Kestrel.Https should update ASP.NET Core dependencies to 2.1 or later.

Las aplicaciones y bibliotecas que tienen como destino ASP.NET Core 2.1 o posterior deben quitar las referencias directas a Microsoft.AspNetCore.Server. Kestrel Paquete Https.Apps and libraries targeting ASP.NET Core 2.1 or later should remove any direct references to the Microsoft.AspNetCore.Server.Kestrel.Https package.

Newtonsoft.Js(Json.NET)Newtonsoft.Json (Json.NET) support

Como parte del trabajo para mejorar el marco compartido de ASP.NET Core,Newtonsoft.Js en (Json.NET) se ha quitado del marco compartido ASP.NET Core.As part of the work to improve the ASP.NET Core shared framework, Newtonsoft.Json (Json.NET) has been removed from the ASP.NET Core shared framework.

El serializador JSON predeterminado para ASP.NET Core es ahora , que es System.Text.Json nuevo en .NET Core 3.0.The default JSON serializer for ASP.NET Core is now System.Text.Json, which is new in .NET Core 3.0. Considere la posibilidad System.Text.Json de usar cuando sea posible.Consider using System.Text.Json when possible. Es de alto rendimiento y no requiere una dependencia de biblioteca adicional.It's high-performance and doesn't require an additional library dependency. Sin embargo, como es nuevo, es posible que falte actualmente System.Text.Json características que necesita la aplicación.However, since System.Text.Json is new, it might currently be missing features that your app needs. Para obtener más información, vea How to migrate from Newtonsoft.Json to System.Text.Json (Cómomigrar de Newtonsoft.Jsa System.Text.Jsen ).For more information, see How to migrate from Newtonsoft.Json to System.Text.Json.

Uso Newtonsoft.Jsen un proyecto ASP.NET Core 3.0 SignalRUse Newtonsoft.Json in an ASP.NET Core 3.0 SignalR project

  • Instale Microsoft.AspNetCore. SignalR . Paquete NuGet Protocols.NewtonsoftJson.Install the Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson NuGet package.

  • En el cliente, encadena una AddNewtonsoftJsonProtocol llamada de método a la instancia de HubConnectionBuilder :On the client, chain an AddNewtonsoftJsonProtocol method call to the HubConnectionBuilder instance:

    new HubConnectionBuilder()
        .WithUrl("/chathub")
        .AddNewtonsoftJsonProtocol(...)
        .Build();
    
  • En el servidor, encadena AddNewtonsoftJsonProtocol una llamada de método a la llamada de método en AddSignalR Startup.ConfigureServices :On the server, chain an AddNewtonsoftJsonProtocol method call to the AddSignalR method call in Startup.ConfigureServices:

    services.AddSignalR()
        .AddNewtonsoftJsonProtocol(...);
    

Uso Newtonsoft.Jsen un proyecto de MVC ASP.NET Core 3.0Use Newtonsoft.Json in an ASP.NET Core 3.0 MVC project

  • Instale el Microsoft.AspNetCore.Mvc.NewtonsoftJson paquete.Install the Microsoft.AspNetCore.Mvc.NewtonsoftJson package.

  • Actualice Startup.ConfigureServices para llamar a AddNewtonsoftJson .Update Startup.ConfigureServices to call AddNewtonsoftJson.

    services.AddMvc()
        .AddNewtonsoftJson();
    

    AddNewtonsoftJson es compatible con los nuevos métodos de registro del servicio MVC:AddNewtonsoftJson is compatible with the new MVC service registration methods:

    • AddRazorPages
    • AddControllersWithViews
    • AddControllers
    services.AddControllers()
        .AddNewtonsoftJson();
    

    Newtonsoft.Json la configuración se puede establecer en la llamada a AddNewtonsoftJson :Newtonsoft.Json settings can be set in the call to AddNewtonsoftJson:

    services.AddMvc()
        .AddNewtonsoftJson(options =>
               options.SerializerSettings.ContractResolver =
                  new CamelCasePropertyNamesContractResolver());
    

    Nota: Si el AddNewtonsoftJson método no está disponible, asegúrese de que ha instalado el Microsoft.AspNetCore.Mvc.NewtonsoftJson paquete.Note: If the AddNewtonsoftJson method isn't available, make sure that you installed the Microsoft.AspNetCore.Mvc.NewtonsoftJson package. Un error común es instalar elNewtonsoft.Js en el paquete en lugar del Microsoft.AspNetCore.Mvc.NewtonsoftJson paquete.A common error is to install the Newtonsoft.Json package instead of the Microsoft.AspNetCore.Mvc.NewtonsoftJson package.

Para más información, consulte Add Newtonsoft.Json-based JSON format support(Newtonsoft.Jscompatibilidad con formato JSON basado en ).For more information, see Add Newtonsoft.Json-based JSON format support.

Registro del servicio MVCMVC service registration

ASP.NET Core 3.0 agrega nuevas opciones para registrar escenarios de MVC dentro de Startup.ConfigureServices .ASP.NET Core 3.0 adds new options for registering MVC scenarios inside Startup.ConfigureServices.

Hay disponibles tres nuevos métodos de extensión de nivel superior relacionados con escenarios de MVC IServiceCollection en .Three new top-level extension methods related to MVC scenarios on IServiceCollection are available. Las plantillas usan estos nuevos métodos en lugar de AddMvc .Templates use these new methods instead of AddMvc. Sin embargo, AddMvc sigue comportando como lo ha hecho en versiones anteriores.However, AddMvc continues to behave as it has in previous releases.

En el ejemplo siguiente se agrega compatibilidad con controladores y características relacionadas con la API, pero no con vistas ni páginas.The following example adds support for controllers and API-related features, but not views or pages. La plantilla de API usa este código:The API template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

En el ejemplo siguiente se agrega compatibilidad con controladores, características relacionadas con la API y vistas, pero no con páginas.The following example adds support for controllers, API-related features, and views, but not pages. La plantilla aplicación web (MVC) usa este código:The Web Application (MVC) template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
}

En el ejemplo siguiente se agrega compatibilidad con Razor Pages y compatibilidad mínima con el controlador.The following example adds support for Razor Pages and minimal controller support. La plantilla Aplicación web usa este código:The Web Application template uses this code:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
}

Los nuevos métodos también se pueden combinar.The new methods can also be combined. El ejemplo siguiente es equivalente a llamar AddMvc a en ASP.NET Core 2.2:The following example is equivalent to calling AddMvc in ASP.NET Core 2.2:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Enrutamiento del código de inicioRouting startup code

Si una aplicación llama a UseMvc o UseSignalR , migre la aplicación a Endpoint Routing si es posible.If an app calls UseMvc or UseSignalR, migrate the app to Endpoint Routing if possible. Para mejorar la compatibilidad de Endpoint Routing con versiones anteriores de MVC, hemos revertido algunos de los cambios en la generación de direcciones URL introducidos en ASP.NET Core 2.2.To improve Endpoint Routing compatibility with previous versions of MVC, we've reverted some of the changes in URL generation introduced in ASP.NET Core 2.2. Si ha experimentado problemas al usar el enrutamiento de puntos de conexión en la versión 2.2, espere mejoras en ASP.NET Core 3.0 con las siguientes excepciones:If you experienced problems using Endpoint Routing in 2.2, expect improvements in ASP.NET Core 3.0 with the following exceptions:

  • Si la aplicación implementa o IRouter hereda de Route , use DynamicRouteValuesTransformer como reemplazo.If the app implements IRouter or inherits from Route, use DynamicRouteValuesTransformer as the replacement.
  • Si la aplicación accede directamente dentro de MVC para analizar direcciones URL, puede reemplazarlo por el uso de RouteData.Routers LinkParser.ParsePathByEndpointName.If the app directly accesses RouteData.Routers inside MVC to parse URLs, you can replace this with use of LinkParser.ParsePathByEndpointName.
    • Defina la ruta con un nombre de ruta.Define the route with a route name.
    • Use LinkParser.ParsePathByEndpointName y pase el nombre de ruta deseado.Use LinkParser.ParsePathByEndpointName and pass in the desired route name.

Endpoint Routing admite la misma sintaxis de patrón de ruta y características de creación de patrones de ruta que IRouter .Endpoint Routing supports the same route pattern syntax and route pattern authoring features as IRouter. El enrutamiento de puntos de conexión admite IRouteConstraint .Endpoint Routing supports IRouteConstraint. El enrutamiento de puntos [Route] de conexión admite , y los demás atributos de enrutamiento [HttpGet] mvc.Endpoint routing supports [Route], [HttpGet], and the other MVC routing attributes.

Para la mayoría de las aplicaciones, Startup solo se requieren cambios.For most applications, only Startup requires changes.

Migración Startup.ConfigureMigrate Startup.Configure

Consejos generales:General advice:

  • Agregue UseRouting.Add UseRouting.

  • Si la aplicación llama a UseStaticFiles , coloque antes UseStaticFiles de UseRouting .If the app calls UseStaticFiles, place UseStaticFiles before UseRouting.

  • Si la aplicación usa características de autenticación o autorización como o , coloque la llamada a y : después de AuthorizePage y , pero antes de [Authorize] UseAuthentication UseAuthorization UseRouting UseCors UseEndpoints :If the app uses authentication/authorization features such as AuthorizePage or [Authorize], place the call to UseAuthentication and UseAuthorization: after, UseRouting and UseCors, but before UseEndpoints:

    public void Configure(IApplicationBuilder app)
    {
      ...
    
      app.UseStaticFiles();
    
      app.UseRouting();
      app.UseCors();
    
      app.UseAuthentication();
      app.UseAuthorization();
    
      app.UseEndpoints(endpoints => {
         endpoints.MapControllers();
      });
    
  • Reemplace UseMvc o UseSignalR por UseEndpoints .Replace UseMvc or UseSignalR with UseEndpoints.

  • Si la aplicación usa escenarios de CORS, como , coloque la llamada a delante de cualquier otro middleware que use [EnableCors] UseCors CORS (por ejemplo, coloque antes UseCors de , y UseAuthentication UseAuthorization UseEndpoints ).If the app uses CORS scenarios, such as [EnableCors], place the call to UseCors before any other middleware that use CORS (for example, place UseCors before UseAuthentication, UseAuthorization, and UseEndpoints).

  • Reemplace IHostingEnvironment por y agregue una instrucción para el espacio de nombres IWebHostEnvironment using Microsoft.Extensions.Hosting .Replace IHostingEnvironment with IWebHostEnvironment and add a using statement for the Microsoft.Extensions.Hosting namespace.

  • Reemplace IApplicationLifetime por ( espacio de IHostApplicationLifetime Microsoft.Extensions.Hosting nombres).Replace IApplicationLifetime with IHostApplicationLifetime (Microsoft.Extensions.Hosting namespace).

  • Reemplace EnvironmentName por ( espacio de Environments Microsoft.Extensions.Hosting nombres).Replace EnvironmentName with Environments (Microsoft.Extensions.Hosting namespace).

El código siguiente es un ejemplo de Startup.Configure en una aplicación ASP.NET Core 2.2 típica:The following code is an example of Startup.Configure in a typical ASP.NET Core 2.2 app:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseSignalR(hubs =>
    {
        hubs.MapHub<ChatHub>("/chat");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Después de actualizar el código Startup.Configure anterior:After updating the previous Startup.Configure code:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();

    app.UseRouting();

    app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chat");
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Advertencia

Para la mayoría de las aplicaciones, las llamadas a , y deben aparecer entre las UseAuthentication llamadas a y para que sean UseAuthorization UseCors UseRouting UseEndpoints eficaces.For most apps, calls to UseAuthentication, UseAuthorization, and UseCors must appear between the calls to UseRouting and UseEndpoints to be effective.

Comprobaciones de estadoHealth Checks

Las comprobaciones de estado utilizan el enrutamiento de puntos de conexión con el host genérico.Health Checks use endpoint routing with the Generic Host. En Startup.Configure, llame a MapHealthChecks en el generador de puntos de conexiones con la dirección URL del punto de conexión o la ruta de acceso relativa:In Startup.Configure, call MapHealthChecks on the endpoint builder with the endpoint URL or relative path:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Los puntos de conexión de las comprobaciones de estado pueden:Health Checks endpoints can:

  • Especificar uno o más hosts o puertos permitidos.Specify one or more permitted hosts/ports.
  • Requerir autorización.Require authorization.
  • Requerir CORS.Require CORS.

Para más información, consulte Comprobaciones de estado en ASP.NET Core.For more information, see Comprobaciones de estado en ASP.NET Core.

Guía de middleware de seguridadSecurity middleware guidance

La compatibilidad con la autorización y CORS se unifica en torno al enfoque de middleware.Support for authorization and CORS is unified around the middleware approach. Esto permite el uso del mismo middleware y funcionalidad en estos escenarios.This allows use of the same middleware and functionality across these scenarios. En esta versión se proporciona un middleware de autorización actualizado y se ha mejorado el middleware cors para que pueda comprender los atributos usados por los controladores mvc.An updated authorization middleware is provided in this release, and CORS Middleware is enhanced so that it can understand the attributes used by MVC controllers.

CORSCORS

Anteriormente, CORS podía ser difícil de configurar.Previously, CORS could be difficult to configure. Se proporcionó middleware para su uso en algunos casos de uso, pero los filtros MVC estaban diseñados para usarse sin el middleware en otros casos de uso.Middleware was provided for use in some use cases, but MVC filters were intended to be used without the middleware in other use cases. Con ASP.NET Core 3.0, se recomienda que todas las aplicaciones que requieren CORS usen el middleware cors junto con el enrutamiento de puntos de conexión.With ASP.NET Core 3.0, we recommend that all apps that require CORS use the CORS Middleware in tandem with Endpoint Routing. UseCors se puede proporcionar con una directiva predeterminada y los atributos y se pueden usar [EnableCors] para invalidar la directiva predeterminada cuando sea [DisableCors] necesario.UseCors can be provided with a default policy, and [EnableCors] and [DisableCors] attributes can be used to override the default policy where required.

En el ejemplo siguiente:In the following example:

  • CORS está habilitado para todos los puntos de conexión con la default directiva con nombre.CORS is enabled for all endpoints with the default named policy.
  • La MyController clase deshabilita CORS con el atributo [DisableCors] .The MyController class disables CORS with the [DisableCors] attribute.
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseCors("default");

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

[DisableCors]
public class MyController : ControllerBase
{
    ...
}

AuthorizationAuthorization

En versiones anteriores de ASP.NET Core, se proporcionaba compatibilidad con la autorización a través del [Authorize] atributo .In earlier versions of ASP.NET Core, authorization support was provided via the [Authorize] attribute. El middleware de autorización no estaba disponible.Authorization middleware wasn't available. En ASP.NET Core 3.0, se requiere middleware de autorización.In ASP.NET Core 3.0, authorization middleware is required. Se recomienda colocar el middleware ASP.NET core authorization ( UseAuthorization ) inmediatamente después de UseAuthentication .We recommend placing the ASP.NET Core Authorization Middleware (UseAuthorization) immediately after UseAuthentication. El middleware de autorización también se puede configurar con una directiva predeterminada, que se puede invalidar.The Authorization Middleware can also be configured with a default policy, which can be overridden.

En ASP.NET Core 3.0 o posterior, se llama a en y lo siguiente requiere un usuario UseAuthorization Startup.Configure que haya iniciado HomeController sesión:In ASP.NET Core 3.0 or later, UseAuthorization is called in Startup.Configure, and the following HomeController requires a signed in user:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

public class HomeController : Controller
{
    [Authorize]
    public IActionResult BuyWidgets()
    {
        ...
    }
}

Al usar el enrutamiento de puntos de conexión, se recomienda no configurar y, en AuthorizeFilter su lugar, confiar en el middleware de autorización.When using endpoint routing, we recommend against configuring AuthorizeFilter and instead relying on the Authorization middleware. Si la aplicación usa como filtro global en MVC, se recomienda refactorizar el código para proporcionar una directiva AuthorizeFilter en la llamada a AddAuthorization .If the app uses an AuthorizeFilter as a global filter in MVC, we recommend refactoring the code to provide a policy in the call to AddAuthorization.

está DefaultPolicy configurado inicialmente para requerir autenticación, por lo que no se requiere ninguna configuración adicional.The DefaultPolicy is initially configured to require authentication, so no additional configuration is required. En el ejemplo siguiente, los puntos de conexión mvc se marcan como para que todas las solicitudes RequireAuthorization se deben autorizar en función de DefaultPolicy .In the following example, MVC endpoints are marked as RequireAuthorization so that all requests must be authorized based on the DefaultPolicy. Sin embargo, HomeController permite el acceso sin que el usuario inicie sesión en la aplicación debido a [AllowAnonymous] :However, the HomeController allows access without the user signing into the app due to [AllowAnonymous]:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute().RequireAuthorization();
    });
}

[AllowAnonymous]
public class HomeController : Controller
{
    ...
}

Autorización para puntos de conexión específicosAuthorization for specific endpoints

La autorización también se puede configurar para clases específicas de puntos de conexión.Authorization can also be configured for specific classes of endpoints. El código siguiente es un ejemplo de conversión de una aplicación MVC que configuró una aplicación global en una aplicación con una directiva AuthorizeFilter específica que requiere autorización:The following code is an example of converting an MVC app that configured a global AuthorizeFilter to an app with a specific policy requiring authorization:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    static readonly string _RequireAuthenticatedUserPolicy = 
                            "RequireAuthenticatedUserPolicy";
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
                 options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // Pre 3.0:
        // services.AddMvc(options => options.Filters.Add(new AuthorizeFilter(...));

        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddAuthorization(o => o.AddPolicy(_RequireAuthenticatedUserPolicy,
                        builder => builder.RequireAuthenticatedUser()));

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute()
                .RequireAuthorization(_RequireAuthenticatedUserPolicy);
            endpoints.MapRazorPages();
        });
    }
}

Las directivas también se pueden personalizar.Policies can also be customized. está DefaultPolicy configurado para requerir autenticación:The DefaultPolicy is configured to require authentication:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
                 options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
              .RequireAuthenticatedUser()
              .Build();
        });

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute().RequireAuthorization();
            endpoints.MapRazorPages();
        });
    }
}
[AllowAnonymous]
public class HomeController : Controller
{

Como alternativa, todos los puntos de conexión se pueden configurar para requerir autorización sin [Authorize] o mediante la configuración de RequireAuthorization FallbackPolicy .Alternatively, all endpoints can be configured to require authorization without [Authorize] or RequireAuthorization by configuring a FallbackPolicy. es FallbackPolicy diferente de DefaultPolicy .The FallbackPolicy is different from the DefaultPolicy. o DefaultPolicy desencadena , mientras que se desencadena cuando no se establece ninguna otra [Authorize] RequireAuthorization FallbackPolicy directiva.The DefaultPolicy is triggered by [Authorize] or RequireAuthorization, while the FallbackPolicy is triggered when no other policy is set. FallbackPolicy está configurado inicialmente para permitir solicitudes sin autorización.FallbackPolicy is initially configured to allow requests without authorization.

El ejemplo siguiente es el mismo que el ejemplo anterior, pero usa para requerir siempre la autenticación en todos los puntos de conexión, excepto DefaultPolicy FallbackPolicy cuando se especifica [AllowAnonymous] :The following example is the same as the preceding DefaultPolicy example but uses the FallbackPolicy to always require authentication on all endpoints except when [AllowAnonymous] is specified:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAuthorization(options =>
    {
        options.FallbackPolicy = new AuthorizationPolicyBuilder()
          .RequireAuthenticatedUser()
          .Build();
    });
}

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

[AllowAnonymous]
public class HomeController : Controller
{
    ...
}

La autorización por middleware funciona sin que el marco tenga ningún conocimiento específico de la autorización.Authorization by middleware works without the framework having any specific knowledge of authorization. Por ejemplo, las comprobaciones de estado no tienen ningún conocimiento específico de la autorización, pero las comprobaciones de estado pueden tener una directiva de autorización configurable aplicada por el middleware.For instance, health checks has no specific knowledge of authorization, but health checks can have a configurable authorization policy applied by the middleware.

Además, cada punto de conexión puede personalizar sus requisitos de autorización.Additionally, each endpoint can customize its authorization requirements. En el ejemplo siguiente, UseAuthorization procesa la autorización con , pero el punto de conexión de comprobación de estado requiere un DefaultPolicy /healthz admin usuario:In the following example, UseAuthorization processes authorization with the DefaultPolicy, but the /healthz health check endpoint requires an admin user:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints
            .MapHealthChecks("/healthz")
            .RequireAuthorization(new AuthorizeAttribute(){ Roles = "admin", });
    });
}

La protección se implementa en algunos escenarios.Protection is implemented for some scenarios. El middleware de puntos de conexión produce una excepción si se omite una directiva de AUTORIZACIÓN o CORS debido a la falta de middleware.Endpoints Middleware throws an exception if an authorization or CORS policy is skipped due to missing middleware. La compatibilidad del analizador para proporcionar comentarios adicionales sobre la configuración incorrecta está en curso.Analyzer support to provide additional feedback about misconfiguration is in progress.

Controladores de autorización personalizadosCustom authorization handlers

Si la aplicación usa controladores de autorización personalizados,el enrutamiento de puntos de conexión pasa un tipo de recurso diferente a los controladores de MVC.If the app uses custom authorization handlers, endpoint routing passes a different resource type to handlers than MVC. Los controladores que esperan que el recurso de contexto del controlador de autorización sea de tipo (el tipo de recurso proporcionado por los filtros AuthorizationFilterContext DE MVC)tendrán que actualizarse para controlar los recursos de tipo (el tipo de recurso proporcionado a los controladores de autorización por enrutamiento de punto de RouteEndpoint conexión).Handlers that expect the authorization handler context resource to be of type AuthorizationFilterContext (the resource type provided by MVC filters) will need to be updated to handle resources of type RouteEndpoint (the resource type given to authorization handlers by endpoint routing).

MVC todavía usa recursos, por lo que si la aplicación usa filtros de autorización mvc junto con la autorización de enrutamiento de puntos de conexión, puede ser necesario controlar AuthorizationFilterContext ambos tipos de recursos.MVC still uses AuthorizationFilterContext resources, so if the app uses MVC authorization filters along with endpoint routing authorization, it may be necessary to handle both types of resources.

SignalR

La SignalR asignación de concentradores ahora tiene lugar dentro de UseEndpoints .Mapping of SignalR hubs now takes place inside UseEndpoints.

Asigne cada centro con MapHub .Map each hub with MapHub. Al igual que en versiones anteriores, cada centro se muestra explícitamente.As in previous versions, each hub is explicitly listed.

En el ejemplo siguiente, se agrega compatibilidad con ChatHub SignalR el centro:In the following example, support for the ChatHub SignalR hub is added:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>();
    });
}

Hay una nueva opción para controlar los límites de tamaño de los mensajes de los clientes.There is a new option for controlling message size limits from clients. Por ejemplo, en Startup.ConfigureServices:For example, in Startup.ConfigureServices:

services.AddSignalR(hubOptions =>
{
    hubOptions.MaximumReceiveMessageSize = 32768;
});

En ASP.NET Core 2.2, podría establecer y que controlaría eficazmente TransportMaxBufferSize el tamaño máximo del mensaje.In ASP.NET Core 2.2, you could set the TransportMaxBufferSize and that would effectively control the maximum message size. En ASP.NET Core 3.0, esa opción ahora solo controla el tamaño máximo antes de que se observa la contrapresión.In ASP.NET Core 3.0, that option now only controls the maximum size before backpressure is observed.

Controladores MVCMVC controllers

La asignación de controladores ahora tiene lugar dentro de UseEndpoints .Mapping of controllers now takes place inside UseEndpoints.

Agregue MapControllers si la aplicación usa el enrutamiento de atributos.Add MapControllers if the app uses attribute routing. Dado que el enrutamiento incluye compatibilidad con muchos marcos en ASP.NET Core 3.0 o posterior, la adición de controladores enrutados a atributos es opcional.Since routing includes support for many frameworks in ASP.NET Core 3.0 or later, adding attribute-routed controllers is opt-in.

Reemplace lo siguiente:Replace the following:

  • MapRoute con MapControllerRouteMapRoute with MapControllerRoute
  • MapAreaRoute con MapAreaControllerRouteMapAreaRoute with MapAreaControllerRoute

Puesto que el enrutamiento ahora incluye compatibilidad con algo más que MVC, la terminología ha cambiado para que estos métodos den claramente lo que hacen.Since routing now includes support for more than just MVC, the terminology has changed to make these methods clearly state what they do. Las rutas convencionales como MapControllerRoute / MapAreaControllerRoute / MapDefaultControllerRoute se aplican en el orden en que se agregan.Conventional routes such as MapControllerRoute/MapAreaControllerRoute/MapDefaultControllerRoute are applied in the order that they're added. Coloque primero rutas más específicas (por ejemplo, rutas para un área).Place more specific routes (such as routes for an area) first.

En el ejemplo siguiente:In the following example:

  • MapControllers agrega compatibilidad con controladores enrutados por atributos.MapControllers adds support for attribute-routed controllers.
  • MapAreaControllerRoute agrega una ruta convencional para los controladores de un área.MapAreaControllerRoute adds a conventional route for controllers in an area.
  • MapControllerRoute agrega una ruta convencional para los controladores.MapControllerRoute adds a conventional route for controllers.
public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapAreaControllerRoute(
            "admin",
            "admin",
            "Admin/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllerRoute(
            "default", "{controller=Home}/{action=Index}/{id?}");
    });
}

Eliminación de sufijos asincrónicos de los nombres de acción de controladorAsync suffix removal from controller action names

En ASP.NET Core 3.0, ASP.NET Core MVC quita el sufijo de los nombres de Async acción del controlador.In ASP.NET Core 3.0, ASP.NET Core MVC removes the Async suffix from controller action names. Tanto el enrutamiento como la generación de vínculos se verán afectados por este nuevo valor predeterminado.Both routing and link generation are impacted by this new default. Por ejemplo:For example:

public class ProductsController : Controller
{
    public async Task<IActionResult> ListAsync()
    {
        var model = await _dbContext.Products.ToListAsync();
        return View(model);
    }
}

Antes de ASP.NET Core 3.0:Prior to ASP.NET Core 3.0:

  • Se puede acceder a la acción anterior en la ruta Products/ListAsync.The preceding action could be accessed at the Products/ListAsync route.

  • Se requiere la generación de vínculos especificando el Async sufijo .Link generation required specifying the Async suffix. Por ejemplo:For example:

    <a asp-controller="Products" asp-action="ListAsync">List</a>
    

En ASP.NET Core 3.0:In ASP.NET Core 3.0:

  • Se puede acceder a la acción anterior en la ruta Products/List.The preceding action can be accessed at the Products/List route.

  • La generación de vínculos no requiere especificar el Async sufijo .Link generation doesn't require specifying the Async suffix. Por ejemplo:For example:

    <a asp-controller="Products" asp-action="List">List</a>
    

Este cambio no afecta a los nombres especificados mediante el [ActionName] atributo .This change doesn't affect names specified using the [ActionName] attribute. El comportamiento predeterminado se puede deshabilitar con el código siguiente en Startup.ConfigureServices :The default behavior can be disabled with the following code in Startup.ConfigureServices:

services.AddMvc(options =>
    options.SuppressAsyncSuffixInActionNames = false);

Como se explica en la documentación sobrelas diferencias con respecto a versiones anteriores del enrutamiento, hay algunas diferencias en la generación de vínculos (por ejemplo, mediante y Url.Link API similares).As explained in documentation on differences from earlier versions of routing, there are some differences in link generation (using Url.Link and similar APIs, for example). Entre ellas se incluyen las siguientes:These include:

  • De forma predeterminada, cuando se usa el enrutamiento de puntos de conexión, no se conservan necesariamente las mayúsculas y minúsculas de los parámetros de ruta en los URI generados.By default, when using endpoint routing, casing of route parameters in generated URIs is not necessarily preserved. Este comportamiento se puede controlar con la IOutboundParameterTransformer interfaz .This behavior can be controlled with the IOutboundParameterTransformer interface.
  • La generación de un URI para una ruta no válida (un controlador, una acción o una página que no existe) generará una cadena vacía en el enrutamiento del punto de conexión en lugar de generar un URI no válido.Generating a URI for an invalid route (a controller/action or page that doesn't exist) will produce an empty string under endpoint routing instead of producing an invalid URI.
  • Los valores ambiente (parámetros de ruta del contexto actual) no se usan automáticamente en la generación de vínculos con enrutamiento de punto de conexión.Ambient values (route parameters from the current context) are not automatically used in link generation with endpoint routing. Anteriormente, al generar un vínculo a otra acción (o página), los valores de ruta no especificados se inferían de los valores de ambiente de las rutas actuales.Previously, when generating a link to another action (or page), unspecified route values would be inferred from the current routes ambient values. Al usar el enrutamiento de punto de conexión, todos los parámetros de ruta deben especificarse explícitamente durante la generación de vínculos.When using endpoint routing, all route parameters must be specified explicitly during link generation.

Razor PagesRazor Pages

La Razor asignación de páginas ahora tiene lugar dentro de UseEndpoints .Mapping Razor Pages now takes place inside UseEndpoints.

Agregue MapRazorPages si la aplicación usa Razor Pages.Add MapRazorPages if the app uses Razor Pages. Puesto que El enrutamiento de puntos de conexión incluye compatibilidad con muchos marcos, ahora se admite la Razor adición de Páginas.Since Endpoint Routing includes support for many frameworks, adding Razor Pages is now opt-in.

En el método Startup.Configure siguiente, MapRazorPages agrega compatibilidad con Razor Pages:In the following Startup.Configure method, MapRazorPages adds support for Razor Pages:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Uso de MVC sin enrutamiento de puntos de conexiónUse MVC without Endpoint Routing

El uso de MVC UseMvc mediante o ASP.NET Core UseMvcWithDefaultRoute 3.0 requiere una suscripción explícita dentro de Startup.ConfigureServices .Using MVC via UseMvc or UseMvcWithDefaultRoute in ASP.NET Core 3.0 requires an explicit opt-in inside Startup.ConfigureServices. Esto es necesario porque MVC debe saber si puede confiar en la autorización y el middleware cors durante la inicialización.This is required because MVC must know whether it can rely on the authorization and CORS Middleware during initialization. Se proporciona un analizador que advierte si la aplicación intenta usar una configuración no admitida.An analyzer is provided that warns if the app attempts to use an unsupported configuration.

Si la aplicación requiere compatibilidad IRouter heredada, deshabilite el uso EnableEndpointRouting de cualquiera de los enfoques siguientes en Startup.ConfigureServices :If the app requires legacy IRouter support, disable EnableEndpointRouting using any of the following approaches in Startup.ConfigureServices:

services.AddMvc(options => options.EnableEndpointRouting = false);
services.AddControllers(options => options.EnableEndpointRouting = false);
services.AddControllersWithViews(options => options.EnableEndpointRouting = false);
services.AddRazorPages().AddMvcOptions(options => options.EnableEndpointRouting = false);

Comprobaciones de mantenimientoHealth checks

Las comprobaciones de estado se pueden usar como enrutador-ware con el enrutamiento de puntos de conexión.Health checks can be used as a router-ware with Endpoint Routing.

Agregue para MapHealthChecks usar comprobaciones de estado con El enrutamiento de puntos de conexión.Add MapHealthChecks to use health checks with Endpoint Routing. El MapHealthChecks método acepta argumentos similares a UseHealthChecks .The MapHealthChecks method accepts arguments similar to UseHealthChecks. La ventaja de usar over es la capacidad de aplicar la autorización y de tener un mayor control preciso MapHealthChecks sobre la directiva de UseHealthChecks coincidencia.The advantage of using MapHealthChecks over UseHealthChecks is the ability to apply authorization and to have greater fine-grained control over the matching policy.

En el ejemplo siguiente, se MapHealthChecks llama a para un punto de conexión de comprobación de estado en /healthz :In the following example, MapHealthChecks is called for a health check endpoint at /healthz:

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks("/healthz", new HealthCheckOptions() { });
    });
}

HostBuilder reemplaza a WebHostBuilderHostBuilder replaces WebHostBuilder

Las ASP.NET Core 3.0 usan el host genérico.The ASP.NET Core 3.0 templates use Generic Host. Las versiones anteriores usaban el host web.Previous versions used Web Host. El código siguiente muestra la clase generada ASP.NET plantilla de Core 3.0: ProgramThe following code shows the ASP.NET Core 3.0 template generated Program class:

// requires using Microsoft.AspNetCore.Hosting;
// requires using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

En el código siguiente se muestra ASP.NET clase generada por plantilla de core 2.2: ProgramThe following code shows the ASP.NET Core 2.2 template-generated Program class:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

IWebHostBuilder permanece en la versión 3.0 y es el tipo de que webBuilder se ve en el ejemplo de código anterior.IWebHostBuilder remains in 3.0 and is the type of the webBuilder seen in the preceding code sample. WebHostBuilder dejará de usarse en una versión futura y se reemplazará por HostBuilder .WebHostBuilder will be deprecated in a future release and replaced by HostBuilder.

El cambio más significativo de WebHostBuilder a es en la HostBuilder inserción de dependencias (DI).The most significant change from WebHostBuilder to HostBuilder is in dependency injection (DI). Al usar HostBuilder , solo puede insertar lo siguiente en el constructor de Startup :When using HostBuilder, you can only inject the following into Startup's constructor:

Restricciones HostBuilder de DI:The HostBuilder DI constraints:

  • Habilite el contenedor de DI para que se pueda crear solo una vez.Enable the DI container to be built only one time.
  • Evita los problemas resultantes de duración del objeto, como la resolución de varias instancias de singletons.Avoids the resulting object lifetime issues like resolving multiple instances of singletons.

Para obtener más información, vea Evitar la inserción del servicio de inicio ASP.NET Core 3.For more information, see Avoiding Startup service injection in ASP.NET Core 3.

AddAuthorization se ha movido a otro ensambladoAddAuthorization moved to a different assembly

Los ASP.NET Core 2.2 y los AddAuthorization métodos inferiores deMicrosoft.AspNetCore.Authorization.dll:The ASP.NET Core 2.2 and lower AddAuthorization methods in Microsoft.AspNetCore.Authorization.dll:

  • Se ha cambiado el nombre de AddAuthorizationCore .Have been renamed AddAuthorizationCore.
  • Se han movido a Microsoft.AspNetCore.Authorization.Policy.dll.Have been moved to Microsoft.AspNetCore.Authorization.Policy.dll.

Las aplicaciones que usan Microsoft.AspNetCore.Authorization.dll y Microsoft.AspNetCore.Authorization.Policy.dll no se verán afectadas.Apps that are using both Microsoft.AspNetCore.Authorization.dll and Microsoft.AspNetCore.Authorization.Policy.dll aren't impacted.

Las aplicaciones que no usanMicrosoft.AspNetCore.Authorization.Policy.dll deben realizar una de las siguientes acciones:Apps that are not using Microsoft.AspNetCore.Authorization.Policy.dll should do one of the following:

  • Agregue una referencia a Microsoft.AspNetCore.Authorization.Policy.dll.Add a reference to Microsoft.AspNetCore.Authorization.Policy.dll. Este enfoque funciona para la mayoría de las aplicaciones y es todo lo que se necesita.This approach works for most apps and is all that is required.
  • Cambio al uso AddAuthorizationCoreSwitch to using AddAuthorizationCore

Para obtener más información, vea Cambio importante en ) la sobrecarga reside en un ensamblado diferente AddAuthorization(o => #386.For more information, see Breaking change in AddAuthorization(o =>) overload lives in a different assembly #386.

IU de IdentityIdentity UI

Identity Actualizaciones de la interfaz ASP.NET Core 3.0:Identity UI updates for ASP.NET Core 3.0:

SignalR

El SignalR cliente de JavaScript ha cambiado de a @aspnet/signalr @microsoft/signalr .The SignalR JavaScript client has changed from @aspnet/signalr to @microsoft/signalr. Para reaccionar ante este cambio, cambie las referencias de package.js archivos, require instrucciones e instrucciones ECMAScript. importTo react to this change, change the references in package.json files, require statements, and ECMAScript import statements.

System.Text.Json es el protocolo predeterminadoSystem.Text.Json is the default protocol

System.Text.Json es ahora el protocolo de concentrador predeterminado que usan el cliente y el servidor.System.Text.Json is now the default Hub protocol used by both the client and server.

En Startup.ConfigureServices , llame a para establecer las opciones del AddJsonProtocol serializador.In Startup.ConfigureServices, call AddJsonProtocol to set serializer options.

Servidor:Server:

services.AddSignalR(...)
        .AddJsonProtocol(options =>
        {
            options.PayloadSerializerOptions.WriteIndented = false;
        })

Cliente:Client:

new HubConnectionBuilder()
    .WithUrl("/chathub")
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerOptions.WriteIndented = false;
    })
    .Build();

Cambiar a Newtonsoft.JsencendidoSwitch to Newtonsoft.Json

Si usa características de Newtonsoft.Jsen que no se admiten en System.Text.Jsen, puede volver a Newtonsoft.Json .If you're using features of Newtonsoft.Json that aren't supported in System.Text.Json, you can switch back to Newtonsoft.Json. Consulte Use Newtonsoft.Json in an ASP.NET Core 3.0 SignalR project earlier in this article(Uso de Newtonsoft.Jsen un proyecto de ASP.NET Core 3.0 anteriormente en este artículo).See Use Newtonsoft.Json in an ASP.NET Core 3.0 SignalR project earlier in this article.

Cachés distribuidas en RedisRedis distributed caches

El paquete Microsoft.Extensions.Caching.Redis no está disponible para ASP.NET Core 3.0 o versiones posteriores.The Microsoft.Extensions.Caching.Redis package isn't available for ASP.NET Core 3.0 or later apps. Reemplace la referencia del paquete por Microsoft.Extensions.Caching.StackExchangeRedis.Replace the package reference with Microsoft.Extensions.Caching.StackExchangeRedis. Para más información, consulte Almacenamiento en caché distribuido en ASP.NET Core.For more information, see Almacenamiento en caché distribuido en ASP.NET Core.

Participar en la compilación en tiempo de ejecuciónOpt in to runtime compilation

Antes de ASP.NET Core 3.0, la compilación en tiempo de ejecución de las vistas era una característica implícita del marco.Prior to ASP.NET Core 3.0, runtime compilation of views was an implicit feature of the framework. La compilación en tiempo de ejecución complementa la compilación en tiempo de compilación de vistas.Runtime compilation supplements build-time compilation of views. Permite al marco compilar vistas y páginas Razor (archivos .cshtml) cuando se modifican los archivos, sin tener que volver a compilar toda la aplicación.It allows the framework to compile Razor views and pages (.cshtml files) when the files are modified, without having to rebuild the entire app. Esta característica admite el escenario de realizar una edición rápida en el IDE y actualizar el explorador para ver los cambios.This feature supports the scenario of making a quick edit in the IDE and refreshing the browser to view the changes.

En ASP.NET Core 3.0, la compilación en tiempo de ejecución es un escenario de exclusión.In ASP.NET Core 3.0, runtime compilation is an opt-in scenario. La compilación en tiempo de compilación es el único mecanismo para la compilación de vistas que está habilitada de forma predeterminada.Build-time compilation is the only mechanism for view compilation that's enabled by default. El runtime se basa en Visual Studio o dotnet-watch en Visual Studio Code recompilar el proyecto cuando detecta cambios en los archivos .cshtml.The runtime relies on Visual Studio or dotnet-watch in Visual Studio Code to rebuild the project when it detects changes to .cshtml files. En Visual Studio, los cambios en los archivos .cs, .cshtml o .razor en el proyecto que se ejecuta (Ctrl+F5),pero no depurado (F5),desencadenan la recompilación del proyecto.In Visual Studio, changes to .cs, .cshtml, or .razor files in the project being run (Ctrl+F5), but not debugged (F5), trigger recompilation of the project.

Para habilitar la compilación en tiempo de ejecución ASP.NET proyecto de Core 3.0:To enable runtime compilation in your ASP.NET Core 3.0 project:

  1. Instale Microsoft.AspNetCore.Mvc. Razor . Paquete NuGet RuntimeCompilation.Install the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package.

  2. Actualice Startup.ConfigureServices para llamar a AddRazorRuntimeCompilation :Update Startup.ConfigureServices to call AddRazorRuntimeCompilation:

    Para ASP.NET Core MVC, use el código siguiente:For ASP.NET Core MVC, use the following code:

    services.AddControllersWithViews()
        .AddRazorRuntimeCompilation(...);
    

    Para ASP.NET Core Razor Pages, use el código siguiente:For ASP.NET Core Razor Pages, use the following code:

    services.AddRazorPages()
        .AddRazorRuntimeCompilation(...);
    

El ejemplo de muestra un ejemplo de habilitación condicional de la compilación en tiempo https://github.com/aspnet/samples/tree/master/samples/aspnetcore/mvc/runtimecompilation de ejecución en entornos de desarrollo.The sample at https://github.com/aspnet/samples/tree/master/samples/aspnetcore/mvc/runtimecompilation shows an example of enabling runtime compilation conditionally in Development environments.

Para obtener más información sobre Razor la compilación de archivos, vea Razor compilación de archivos en ASP.NET Core .For more information on Razor file compilation, see Razor compilación de archivos en ASP.NET Core.

Migración de bibliotecas a través de varios destinosMigrate libraries via multi-targeting

Las bibliotecas a menudo necesitan admitir varias versiones de ASP.NET Core.Libraries often need to support multiple versions of ASP.NET Core. La mayoría de las bibliotecas compiladas con versiones anteriores de ASP.NET Core deben seguir funcionando sin problemas.Most libraries that were compiled against previous versions of ASP.NET Core should continue working without issues. Las condiciones siguientes requieren que la aplicación se compile de forma cruzada:The following conditions require the app to be cross-compiled:

  • La biblioteca se basa en una característica que tiene un cambio importante binario.The library relies on a feature that has a binary breaking change.
  • La biblioteca quiere aprovechar las nuevas características de ASP.NET Core 3.0.The library wants to take advantage of new features in ASP.NET Core 3.0.

Por ejemplo:For example:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
  </ItemGroup>
</Project>

Use para habilitar ASP.NET API específicas de #ifdefs Core 3.0:Use #ifdefs to enable ASP.NET Core 3.0-specific APIs:

var webRootFileProvider =
#if NETCOREAPP3_0
    GetRequiredService<IWebHostEnvironment>().WebRootFileProvider;
#elif NETSTANDARD2_0
    GetRequiredService<IHostingEnvironment>().WebRootFileProvider;
#else
#error unknown target framework
#endif

Para más información sobre el uso de ASP.NET Core API en una biblioteca de clases, vea Uso de las API de ASP.NET Core en una biblioteca de clases .For more information on using ASP.NET Core APIs in a class library, see Uso de las API de ASP.NET Core en una biblioteca de clases.

Cambios variosMiscellaneous changes

El sistema de validación de .NET Core 3.0 y versiones posteriores trata las propiedades enlazadas o los parámetros que no aceptan valores NULL como si tuvieran un atributo [Required].The validation system in .NET Core 3.0 and later treats non-nullable parameters or bound properties as if they had a [Required] attribute. Para obtener más información, vea atributo [Obligatorio].For more information, see [Required] attribute.

PublicarPublish

Elimine las carpetas bin y obj en el directorio del proyecto.Delete the bin and obj folders in the project directory.

TestServerTestServer

Para las aplicaciones que TestServer usan directamente con el host genérico, cree en un TestServer en IWebHostBuilder ConfigureWebHost :For apps that use TestServer directly with the Generic Host, create the TestServer on an IWebHostBuilder in ConfigureWebHost:

[Fact]
public async Task GenericCreateAndStartHost_GetTestServer()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .Configure(app => { });
        })
    .StartAsync();

    var response = await host.GetTestServer().CreateClient().GetAsync("/");

    Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

Cambios importantes en la APIBreaking API changes

Revise los cambios importantes:Review breaking changes:

Enrutamiento de puntos de conexión con el parámetro catch-allEndpoint routing with catch-all parameter

Advertencia

Un parámetro catch-all puede relacionar rutas de forma incorrecta debido a un error en el enrutamiento.A catch-all parameter may match routes incorrectly due to a bug in routing. Las aplicaciones afectadas por este error tienen las características siguientes:Apps impacted by this bug have the following characteristics:

  • Una ruta catch-all (por ejemplo, {**slug}")A catch-all route, for example, {**slug}"
  • La ruta catch-all causa un error al relacionar solicitudes que sí que debería relacionar.The catch-all route fails to match requests it should match.
  • Al quitar otras rutas, la ruta catch-all empieza a funcionar.Removing other routes makes catch-all route start working.

Para ver casos de ejemplo relacionados con este error, consulte los errores 18677 y 16579 en GitHub.See GitHub bugs 18677 and 16579 for example cases that hit this bug.

Se incluye una corrección de participación para este error en el SDK de .NET Core 3.1.301 y versiones posteriores.An opt-in fix for this bug is contained in .NET Core 3.1.301 SDK and later. En el código que hay a continuación se establece un cambio interno que corrige este error:The following code sets an internal switch that fixes this bug:

public static void Main(string[] args)
{
   AppContext.SetSwitch("Microsoft.AspNetCore.Routing.UseCorrectCatchAllBehavior", 
                         true);
   CreateHostBuilder(args).Build().Run();
}
// Remaining code removed for brevity.

.NET Core 3.0 en Azure App Service.NET Core 3.0 on Azure App Service

La implementación de .NET Core en Azure App Service ha finalizado.The rollout of .NET Core to Azure App Service is finished. .NET Core 3.0 está disponible en todos los Azure App Service de datos..NET Core 3.0 is available in all Azure App Service datacenters.