次の方法で共有


TryParse および BindAsync メソッドが検証される

ASP.NET Core により、Map* メソッドのパラメーター型に対する TryParse および BindAsync メソッドが検証されるようになりました。 有効なメソッドが見つからなかった場合、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;
}

新しい動作

期待される構文と一致しないパブリック TryParse または BindAsync メソッドが ASP.NET Core によって検出された場合、起動時に例外がスローされます。 前の例の場合、次のようなエラーが生成されます。

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