Поделиться через


Методы TryParse и BindAsync проверены

В ASP.NET Core методы TryParse и BindAsync теперь проверяются в типах параметров для методов Map*. Если допустимый метод не найден, ASP.NET Core выполнит поиск недопустимых методов и вызовет исключение при запуске, если обнаружены такие методы. Исключение помогает избежать непредвиденного поведения, предупреждая вас о том, что сигнатура метода может быть некорректной.

Представленные версии

ASP.NET Core 6.0 RC 2

Прежнее поведение

В предыдущих версиях ASP.NET Core 6, если у TryParse BindAsync метода есть недопустимая подпись, исключение не было создано, а платформа попыталась привязать JSON из текста.

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

Новое поведение

Если ASP.NET Core находит общедоступный метод TryParse или BindAsync, который не соответствует ожидаемому синтаксису, при запуске создается исключение. В предыдущем примере возникает ошибка следующего вида.

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)

Тип критического изменения

Это изменение может повлиять на совместимость двоичного кода и совместимость на уровне исходного кода.

Причина изменения

Это изменение было внесено, чтобы сообщить разработчикам о методах BindAsync и TryParse, имеющих недопустимый формат. Ранее платформа предполагала наличие параметра JSON из основной части метода. Такое предположение может привести к непредвиденному поведению.

Если тип содержит метод BindAsync или TryParse с другим синтаксисом в силу иных причин, отличных от привязки параметра, теперь выводится исключение при запуске. Чтобы избежать такого поведения, можно использовать несколько стратегий.

  • Измените метод BindAsync или TryParse на internal или private.
  • Добавьте новый BindAsync или TryParse метод с синтаксисом, который ищет платформу, — недопустимые методы игнорируются при обнаружении допустимого метода.
  • Пометьте параметр как [FromBody].

Затронутые API

  • RequestDelegateFactory.Create()
  • Все методыIEndpointRouteBuilder.Map*(), например app.MapGet() и app.MapPost().