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