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()