Udostępnij za pośrednictwem


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.

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 lub TryParse na lub internalprivate.
  • Dodaj nową BindAsync metodę lub TryParse , 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() i app.MapPost()