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.

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 ou TryParse pour qu’elle soit internal ou private.
  • Ajoutez une nouvelle méthode BindAsync ou TryParse 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 exemple app.MapGet() et app.MapPost()