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.
Ação recomendada
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
ouTryParse
para serinternal
ouprivate
. - Adicionar um novo
BindAsync
ou métodoTryParse
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()
eapp.MapPost()