アクションに入る前に 400 になる典型がモデルバインディング/バリデーション失敗。[ApiController] だと自動で ProblemDetails っぽい応答になりやすい。
errors / ModelState 相当を読む[FromBody] / [FromQuery] / [FromRoute] の取り違えが多い[Required] / data annotations / FluentValidation の失敗か[FromBody] 必須パラメータif (!ModelState.IsValid)
{
// どのキーが失敗したかをログ
foreach (var kv in ModelState)
foreach (var err in kv.Value.Errors)
_log.LogWarning("{Key}: {Msg}", kv.Key, err.ErrorMessage);
}
関連: ProblemDetails でエラー形式を揃える記事とセットで見るとよい。