Compartilhar via


Os métodos TryParse e BindAsync são validados

ASP.NET Core agora valida os métodos TryParse e BindAsync em tipos de parâmetro para métodos Map*. Se nenhum método válido for encontrado, o ASP.NET Core procurará métodos inválidos e lançará uma exceção na inicialização se um for encontrado. A exceção ajuda a evitar comportamentos inesperados alertando que a assinatura do método pode estar incorreta.

Versão introduzida

ASP.NET Core 6.0 RC 2

Comportamento anterior

Nas versões anteriores do ASP.NET Core 6, se um método TryParse ou BindAsync tivesse uma assinatura inválida, nenhuma exceção era lançada e a estrutura tentava associar JSON do corpo.

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

Novo comportamento

Se ASP.NET Core encontrar um TryParse público ou método BindAsync que não corresponda à sintaxe esperada, uma exceção será lançada na inicialização. O exemplo anterior produz um erro semelhante a:

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 alteração interruptiva

Essa alteração pode afetar a compatibilidade binária e a compatibilidade de origem.

Motivo da alteração

Essa alteração foi feita para que os desenvolvedores estejam cientes dos métodos BindAsync e TryParse que têm um formato inválido. Anteriormente, a estrutura recuava para assumir que o parâmetro é JSON do corpo. Essa suposição pode resultar em um comportamento inesperado.

Se o seu tipo tiver um método BindAsync ou TryParse com sintaxe diferente por um motivo diferente da associação de parâmetros, agora você encontrará uma exceção na inicialização. Para evitar esse comportamento, há várias estratégias disponíveis:

  • Alterar seu método BindAsync ou TryParse para ser internal ou private.
  • Adicionar um novo BindAsync ou método TryParse que tenha a sintaxe que a estrutura procura. Métodos inválidos serão ignorados se um válido for encontrado.
  • Marcar seu parâmetro como [FromBody].

APIs afetadas

  • RequestDelegateFactory.Create()
  • Todos os métodos IEndpointRouteBuilder.Map*(), por exemplo, app.MapGet() e app.MapPost()