Sdílet prostřednictvím


Ověřují se metody TryParse a BindAsync.

ASP.NET Core teď ověřuje TryParse a BindAsync metody u typů parametrů pro Map* metody. Pokud nebyla nalezena žádná platná metoda, ASP.NET Core hledá neplatné metody a vyvolá výjimku při spuštění, pokud je nalezena. Výjimka pomáhá vyhnout se neočekávanému chování tím, že vás upozorní, že podpis metody může být nesprávný.

Zavedená verze

ASP.NET Core 6.0 RC 2

Předchozí chování

V předchozích verzích ASP.NET Core 6, pokud TryParse má nebo BindAsync metoda neplatný podpis, nebyla vyvolána žádná výjimka a architektura se pokusila vytvořit vazbu JSON z těla.

// 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;
}

Nové chování

Pokud ASP.NET Core najde veřejnou TryParse metodu nebo BindAsync metodu, která neodpovídá očekávané syntaxi, vyvolá se při spuštění výjimka. Předchozí příklad vytvoří chybu podobnou této:

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)

Typ zásadní změny

Tato změna může mít vliv na kompatibilitu binárních souborů a kompatibilitu zdroje.

Důvod změny

Tato změna byla provedena tak, aby vývojáři věděli BindAsync o metodách, TryParse které mají neplatný formát. Dříve by se architektura vrátila k předpokladu, že parametr je z těla JSON. Tento předpoklad může vést k neočekávanému chování.

Pokud má váš typ nebo TryParse metodu s jinou BindAsync syntaxí z jiného důvodu než vazby parametrů, dojde při spuštění k výjimce. Abyste se tomuto chování vyhnuli, je k dispozici několik strategií:

  • Změňte svoji BindAsync nebo TryParse metodu tak, aby byla internal nebo private.
  • Přidejte novou BindAsync metodu nebo TryParse metodu, která má syntaxi, kterou architektura hledá – neplatné metody se ignorují, pokud se najde platný.
  • Označte parametr jako [FromBody].

Ovlivněná rozhraní API

  • RequestDelegateFactory.Create()
  • Všechny IEndpointRouteBuilder.Map*() metody, například app.MapGet() a app.MapPost()