I metodi TryParse e BindAsync vengono convalidati
ASP.NET Core ora convalida e i metodi TryParse
e BindAsync
sui tipi di parametro per i metodi Map*
. Se non viene trovato alcun metodo valido, ASP.NET Core ricerca metodi non validi e genera un'eccezione all'avvio se ne viene trovato uno. L'eccezione consente di evitare comportamenti imprevisti avvisando che la firma del metodo potrebbe non essere corretta.
Versione introdotta
ASP.NET Core 6.0 RC 2
Comportamento precedente
Nelle versioni precedenti di ASP.NET Core 6, se un metodo TryParse
o BindAsync
aveva una firma non valida, non veniva generata alcuna eccezione e il framework tentava di associare JSON dal 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;
}
Nuovo comportamento
Se ASP.NET Core trova un metodo TryParse
o BindAsync
pubblico che non corrisponde alla sintassi prevista, viene generata un'eccezione all'avvio. L'esempio precedente genera un errore simile al seguente:
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 di modifica che causa un'interruzione
Questa modifica può influire sulla compatibilità binaria e sulla compatibilità dell'origine.
Motivo della modifica
Questa modifica è stata apportata in modo che gli sviluppatori siano consapevoli dei metodi BindAsync
e TryParse
che hanno un formato non valido. In precedenza, il framework eseguiva il fallback presupponendo che il parametro sia JSON dal corpo. Tale presupposto può comportare un comportamento imprevisto.
Azione consigliata
Se il tipo ha un metodo BindAsync
o TryParse
con una sintassi diversa per un motivo diverso dall’associazione di parametri, verrà ora rilevata un'eccezione all'avvio. Per evitare tale comportamento, sono disponibili più strategie:
- Modificare il metodo
BindAsync
oTryParse
in modo che siainternal
oprivate
. - Aggiungere un nuovo metodo
BindAsync
oTryParse
con la sintassi cercata dal framework. I metodi non validi vengono ignorati se ne viene trovato uno valido. - Contrassegnare il parametro come
[FromBody]
.
API interessate
RequestDelegateFactory.Create()
- Tutti i metodi
IEndpointRouteBuilder.Map*()
, ad esempioapp.MapGet()
eapp.MapPost()