다음을 통해 공유


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

ASP.NET Core는 이제 TryParseBindAsync 메서드가 Map* 메서드의 매개 변수 유형에 대해 유효성 검사를 수행합니다. 유효한 메서드를 찾을 수 없으면 ASP.NET Core는 잘못된 메서드를 검색하고, 프로그램 시작 시 이를 발견하면 예외를 발생시킵니다. 예외는 메서드 서명이 올바르지 않을 수 있음을 경고하여 예기치 않은 동작을 방지하는 데 도움이 됩니다.

도입된 버전

ASP.NET Core 6.0 RC 2

이전 동작

이전 버전의 ASP.NET Core 6에서는 a 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)

파괴적 변경 유형

이 변경 내용은 이진 호환성원본 호환성에 영향을 줄 수 있습니다.

변경 이유

이 변경 내용은 개발자가 잘못된 형식의 BindAsync 메서드 및 TryParse 인식할 수 있도록 변경되었습니다. 이전에는 프레임워크가 매개 변수가 본문의 JSON이라고 가정하는 것으로 대체되었습니다. 이 가정은 예기치 않은 동작을 초래할 수 있습니다.

형식에 BindAsyncTryParse 메서드가 있고, 매개 변수 바인딩이 아닌 이유로 이들 메서드의 구문이 서로 다를 경우, 시작 시 예외가 발생합니다. 이 동작을 방지하기 위해 다음과 같은 여러 가지 전략을 사용할 수 있습니다.

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

영향을 받는 API

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