Compartilhar via


Os métodos TryParse e BindAsync são validados

ASP.NET Core agora valida os métodos TryParse e BindAsync nos tipos de parâmetro para os métodos Map*. Se nenhum método válido for encontrado, ASP.NET Core procurará métodos inválidos e gerará uma exceção na inicialização se for encontrado. A exceção ajuda a evitar um comportamento inesperado alertando você de 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 ou BindAsync método público que não corresponda à sintaxe esperada, uma exceção será gerada 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 mudança disruptiva

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 sejam informados sobre BindAsync e TryParse, os métodos 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:

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

APIs afetadas

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