TryParse 및 BindAsync 메서드의 유효성이 검사됨

이제 ASP.NET Core는 Map* 메서드의 매개 변수 형식에 대한 TryParseBindAsync 메서드의 유효성을 검사합니다. 유효한 메서드를 찾을 수 없는 경우 ASP.NET Core는 잘못된 메서드를 찾고 시작 시 예외(있는 경우)를 throw합니다. 예외는 메서드 시그니처가 잘못되었을 않을 수 있음을 알려서 예기치 않은 동작을 방지하는 데 도움이 됩니다.

도입된 버전

ASP.NET Core 6.0 RC 2

이전 동작

이전 버전의 ASP.NET Core 6에서는 TryParse 또는 BindAsync 메서드에 잘못된 시그니처가 있는 경우 예외가 throw되지 않았고 프레임워크가 본문에서 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 메서드를 찾는 경우 시작 시 예외가 throw됩니다. 이전 예제에서는 다음과 비슷한 오류를 생성합니다.

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이라고 가정하도록 대체됩니다. 이 가정으로 인해 예기치 않은 동작이 발생할 수 있습니다.

매개 변수 바인딩 이외의 이유로 형식에 서로 다른 구문이 포함된 BindAsync 또는 TryParse 메서드가 있는 경우 이제 시작 시 예외가 발생합니다. 이 동작을 방지하기 위해 여러 가지 전략을 사용할 수 있습니다.

  • BindAsync 또는 TryParse 메서드를 internal 또는 private로 변경합니다.
  • 프레임워크가 찾는 구문이 있는 새로운 BindAsync 또는 TryParse 메서드를 추가합니다. 유효한 메서드가 발견되면 잘못된 메서드는 무시됩니다.
  • 매개 변수를 [FromBody]로 표시합니다.

영향을 받는 API

  • RequestDelegateFactory.Create()
  • 모든 IEndpointRouteBuilder.Map*() 메서드(예: app.MapGet(), app.MapPost())