Metody TryParse i BindAsync są weryfikowane
ASP.NET Core sprawdza teraz poprawność TryParse
typów parametrów i BindAsync
metody dla Map*
metod. Jeśli nie znaleziono prawidłowej metody, ASP.NET Core szuka nieprawidłowych metod i zgłasza wyjątek podczas uruchamiania, jeśli zostanie znaleziony. Wyjątek pomaga uniknąć nieoczekiwanego zachowania, ostrzegając, że sygnatura metody może być niepoprawna.
Wprowadzona wersja
ASP.NET Core 6.0 RC 2
Poprzednie zachowanie
W poprzednich wersjach ASP.NET Core 6, jeśli metoda TryParse
lub BindAsync
ma nieprawidłowy podpis, nie zgłoszono wyjątku, a struktura próbowała powiązać kod JSON z treścią.
// 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;
}
Nowe zachowanie
Jeśli ASP.NET Core znajdzie publiczny TryParse
lub BindAsync
metodę, która nie jest zgodna z oczekiwaną składnią, podczas uruchamiania zostanie zgłoszony wyjątek. W poprzednim przykładzie jest wyświetlany błąd podobny do następującego:
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 zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną i zgodność ze źródłem.
Przyczyna wprowadzenia zmiany
Ta zmiana została wprowadzona, aby deweloperzy byli świadomi BindAsync
metod i TryParse
mających nieprawidłowy format. Wcześniej struktura wróciłaby do założenia, że parametr jest JSON z treści. To założenie może spowodować nieoczekiwane zachowanie.
Zalecana akcja
Jeśli typ ma metodę BindAsync
lub TryParse
z inną składnią z innej przyczyny niż powiązanie parametrów, napotkasz teraz wyjątek podczas uruchamiania. Aby uniknąć tego zachowania, dostępnych jest wiele strategii:
- Zmień metodę
BindAsync
lubTryParse
na lubinternal
private
. - Dodaj nową
BindAsync
metodę lubTryParse
, która ma składnię szukaną przez platformę — nieprawidłowe metody są ignorowane, jeśli zostanie znaleziona prawidłowa. - Oznacz parametr jako
[FromBody]
.
Dotyczy interfejsów API
RequestDelegateFactory.Create()
- Wszystkie
IEndpointRouteBuilder.Map*()
metody, na przykład,app.MapGet()
iapp.MapPost()