Les méthodes TryParse et BindAsync sont validées
ASP.NET Core valide désormais les méthodes TryParse
et BindAsync
sur les types de paramètres pour les méthodes Map*
. Si aucune méthode valide n’est trouvée, ASP.NET Core recherche des méthodes non valides et lève une exception au démarrage, le cas échéant. L’exception permet d’éviter tout comportement inattendu en vous signalant que votre signature de méthode peut être incorrecte.
Version introduite
ASP.NET Core 6.0 RC 2
Comportement précédent
Dans les versions précédentes d’ASP.NET Core 6, si une méthode TryParse
ou BindAsync
a une signature non valide, aucune exception n’était levée et l’infrastructure tentait de lier le JSON à partir du corps.
// 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;
}
Nouveau comportement
Si ASP.NET Core trouve une méthode publique TryParse
ou BindAsync
qui ne correspond pas à la syntaxe attendue, une exception est levée au démarrage. L’exemple précédent génère une erreur similaire à :
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)
Type de changement cassant
Cette modification peut affecter la compatibilité binaire et la compatibilité des sources.
Raison du changement
Cette modification a été apportée afin que les développeurs soient conscients des méthodes BindAsync
et TryParse
qui ont un format non valide. Auparavant, l’infrastructure revenait à l’hypothèse que le paramètre est du JSON du corps. Cette hypothèse peut entraîner un comportement inattendu.
Action recommandée
Si votre type a une méthode BindAsync
ou TryParse
avec une syntaxe différente pour une raison autre que la liaison de paramètre, vous rencontrez maintenant une exception au démarrage. Pour éviter ce comportement, plusieurs stratégies sont disponibles :
- Modifiez votre méthode
BindAsync
ouTryParse
pour qu’elle soitinternal
ouprivate
. - Ajoutez une nouvelle méthode
BindAsync
ouTryParse
qui a la syntaxe que l’infrastructure recherche ; les méthodes non valides sont ignorées si une méthode valide est trouvée. - Marquez votre paramètre comme
[FromBody]
.
API affectées
RequestDelegateFactory.Create()
- Toutes les méthodes
IEndpointRouteBuilder.Map*()
, par exempleapp.MapGet()
etapp.MapPost()