Se validan los métodos TryParse y BindAsync

ASP.NET Core ahora valida los métodos TryParse y BindAsync en los tipos de parámetro para los métodos Map*. Si no se encuentra ningún método válido, ASP.NET Core busca métodos no válidos y genera una excepción en el inicio si encuentra uno. La excepción ayuda a evitar un comportamiento inesperado al alertar de que puede que la firma del método sea incorrecta.

Versión introducida

ASP.NET Core 6.0 RC 2

Comportamiento anterior

En versiones anteriores de ASP.NET Core 6, si un método TryParse o BindAsync tenía una firma no válida, no se producía ninguna excepción y el marco intentaba enlazar JSON desde el cuerpo.

// Todo.TryParse is not in a valid format.
// Will try to bind from body as JSON instead.
app.MapPost("/endpoint", (Todo todo) => todo.Item);

public class Todo
{
    public string Item { get; set; }
    public static bool TryParse(string value) => true;
}

Comportamiento nuevo

Si ASP.NET Core encuentra un método TryParse o BindAsync público que no coincide con la sintaxis esperada, se genera una excepción en el inicio. En el ejemplo anterior, se genera un error similar al siguiente:

TryParse method found on Todo with incorrect format. Must be a static method with format
bool TryParse(string, IFormatProvider, out Todo)
bool TryParse(string, out Todo)
but found
Boolean TryParse(System.String)

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria y a la compatibilidad de orígenes.

Motivo del cambio

Este cambio se ha realizado para que los desarrolladores tengan conocimiento de los métodos BindAsync y TryParse que tienen un formato no válido. Anteriormente, el marco suponía que el parámetro es JSON a partir del cuerpo. Dicha suposición puede dar como resultado un comportamiento inesperado.

Si el tipo tiene un método BindAsync o TryParse con una sintaxis diferente por un motivo distinto del enlace de parámetros, ahora encontrará una excepción en el inicio. Para evitar este comportamiento, hay varias estrategias disponibles:

  • Cambie el método BindAsync o TryParse para que sea internal o private.
  • Agregue un nuevo método BindAsync o TryParse que tenga la sintaxis que busca el marco—los métodos no válidos se ignorarán si se encuentra uno válido.
  • Marque el parámetro como [FromBody].

API afectadas

  • RequestDelegateFactory.Create()
  • Todos los métodos IEndpointRouteBuilder.Map*(), por ejemplo, app.MapGet() y app.MapPost().