Методы 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()
.