验证 TryParse 和 BindAsync 方法

ASP.NET Core 现在会验证 TryParse 方法的参数类型上的 BindAsyncMap* 方法。 如果没有找到有效的方法,ASP.NET Core 会在启动期间查找无效的方法,并抛出异常。 该异常会提醒你方法签名可能不正确,因而有助于避免出现意外的行为。

已引入的版本

ASP.NET Core 6.0 RC 2

以前的行为

在早期版本的 ASP.NET Core 6 中,如果某个 TryParseBindAsync 方法具有无效的签名,则不会引发异常,并且框架尝试从正文绑定 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 找到与预期语法不匹配的公共 TryParseBindAsync 方法,则会在启动时引发异常。 上一个示例产生一个类似的错误:

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)

破坏性变更的类型

此更改可能会影响 二进制兼容性源兼容性

更改原因

进行了此更改,使开发人员了解格式无效的BindAsyncTryParse方法。 以前,框架会回退到假设参数是来自正文的 JSON 格式。 此假设可能会导致意外行为。

如果你的类型由于除了参数绑定之外的原因而具有不同语法的 BindAsyncTryParse 方法,你将在启动时遇到异常。 为了避免此行为,可以使用多种策略:

  • 将你的 BindAsyncTryParse 方法更改为 internalprivate
  • 添加具有框架查找的语法的新 BindAsync 方法或 TryParse 方法 - 如果找到有效的方法,则忽略无效的方法。
  • 将参数标记为 [FromBody].

受影响的 API

  • RequestDelegateFactory.Create()
  • 所有IEndpointRouteBuilder.Map*()方法,例如app.MapGet()app.MapPost()