Versión de compatibilidad para ASP.NET Core MVC

Por Rick Anderson

El método SetCompatibilityVersion es una operación inefectiva para las aplicaciones ASP.NET Core 3.0. Es decir, llamar a SetCompatibilityVersion con cualquier valor de CompatibilityVersion no tiene ningún impacto en la aplicación.

Para ver cómo funciona SetCompatibilityVersion con las aplicaciones ASP.NET Core 2.x, seleccione la versión ASP.NET Core 2.2 de este artículo.

El método SetCompatibilityVersion permite a una aplicación ASP.NET Core 2.x participar o no en los cambios de comportamiento importantes incorporados en ASP.NET Core MVC 2.1 o 2.2. Estos cambios de comportamiento importantes suelen estar relacionados con cómo se comporta el subsistema de MVC y cómo el tiempo de ejecución llama al código. Si la aplicación participa, obtendrá el comportamiento más reciente y a largo plazo de ASP.NET Core.

El siguiente código establece el modo de compatibilidad en ASP.NET Core 2.2:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Le recomendamos que pruebe la aplicación con la versión más reciente (CompatibilityVersion.Latest). Prevemos que la mayoría de las aplicaciones no tendrán cambios de comportamiento importantes usando la versión más reciente.

Las aplicaciones que llaman a SetCompatibilityVersion(CompatibilityVersion.Version_2_0) están protegidas frente a los cambios de comportamiento importantes incorporados en ASP.NET Core 2.1/2.2 MVC. Esta protección:

  • No es aplicable a todos los cambios de 2.1 y versiones posteriores, sino que tiene como destino los cambios importantes de comportamiento en tiempo de ejecución de ASP.NET Core en el subsistema de MVC.
  • No se extiende a ASP.NET Core 3.0.

La compatibilidad predeterminada de las aplicaciones ASP.NET Core 2.1 y 2.2 que no llaman a SetCompatibilityVersion es la compatibilidad 2.0. Es decir, no llamar a SetCompatibilityVersion es igual que llamar a SetCompatibilityVersion(CompatibilityVersion.Version_2_0).

El siguiente código establece el modo de compatibilidad en ASP.NET Core 2.2, salvo en los siguientes comportamientos:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        // Include the 2.2 behaviors
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        // Except for the following.
        .AddMvcOptions(options =>
        {
            // Don't combine authorize filters (keep 2.0 behavior).
            options.AllowCombiningAuthorizeFilters = false;
            // All exceptions thrown by an IInputFormatter are treated
            // as model state errors (keep 2.0 behavior).
            options.InputFormatterExceptionPolicy =
                InputFormatterExceptionPolicy.AllExceptions;
        });
}

En el caso de las aplicaciones que encuentran cambios de comportamiento importantes, si se usan los modificadores de compatibilidad adecuados:

  • Se podrá usar la versión más reciente y descartar cambios de comportamiento importantes específicos.
  • Se dispondrá de tiempo para actualizar la aplicación para que funcione con los cambios más recientes.

En la documentación de MvcOptions se incluye una completa explicación de los cambios y por qué son una mejora para la mayoría de los usuarios.

Con ASP.NET Core 3.0, los comportamientos anteriores admitidos por los modificadores de compatibilidad se han quitado. Estamos convencidos de que estos son cambios positivos que beneficiarán a prácticamente todos los usuarios. Al introducir estos cambios en 2.1 y 2.2, la mayoría de las aplicaciones pueden beneficiarse, mientras que otras tienen tiempo para actualizarse.