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