Swashbuckle.AspNetCore 버전을 버전 "4.0.1"에서 "6.2.3"으로 업데이트

안녕하세요.
Swashbuckle.AspNetCore 버전을 "4.0.1"에서 "6.2.3"으로 업데이트하는 흥미로운 작업이 있었습니다. 매우 단순해 보였지만 그렇게 보이지는 않았습니다.
주요 문제는 버전 4에서 버전5으로 전달할 때 발생하는 주요 변경 사항이었습니다. Swashbuckle.AspNetCore는 OpenAPI v2 대신 Swagger/OpenAPIversion v3를 사용하기 시작했습니다. 이 프로젝트는 다른 마이크로 서비스에서 데이터를 가져오기 위해 NSwag를 사용하여 httpClient를 생성합니다. 자동 생성된 코드를 재생성하려는 모든 시도는 Swashbuckle.AspNetCore 버전을 업데이트한 후 변경되었습니다. 이로 인해 많은 빌드 오류가 발생했습니다. 새 코드와 이전 코드 간의 차이점을 줄여야 했습니다.
프로젝트에서 비호환성을 유발하는 주요 차이점은 다음과 같습니다.
  • 자동 생성된 메서드 이름이 변경되었습니다. 이전 형식은 예를 들어 "AddPersonalTaskV2Async"(컨트롤러 클래스 메서드 이름)였습니다. 새로운 자동 생성 이름은 "V2Async"가 되었습니다. 그러한 변화가 많았고 모든 메소드 호출을 수동으로 변경하는 것은 불가능해 보였습니다. CustomOperationIds를 services.AddSwaggerGen에 추가하는 것이 더 나은 결정이었습니다. 나의 경우에는:

  • services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("v1", new OpenApiInfo {Title = "title", Version = "v1"});
                    c.CustomOperationIds(apiDesc =>
                        apiDesc.TryGetMethodInfo(out MethodInfo methodInfo) ? methodInfo.Name : null);
                });
    


  • 속성이 [FromUri]인 매개변수의 이름이 변경되지 않았습니다. 그러나 속성이 [FromBody]인 모든 매개변수는 이름을 body로 변경했습니다. spec에 설명된 대로 [FromUri]는 Operation Object => 매개변수와 정렬되지만 [FromBody]는 Operation Object => requestBody입니다. 요청 본문 개체에 "이름"필드가 없습니다.
  • 매개변수 순서가 변경되었습니다. 이전 순서는 메서드 선언과 동일했습니다. 이제 [FromUri]는 [FromBody]보다 먼저 진행됩니다. 메서드 선언에 무엇을 코딩했는지는 중요하지 않습니다.
  • JObject를 요청 매개변수로 사용하는 경우 예상치 못한 일이 발생합니다. NSWag는 JObject를 System.Collections.Generic.Dictionary로 변경합니다. 동의하지 않는 경우 다음과 같이 ISchemaFilter의 사용자 지정 구현을 코딩하는 것이 좋습니다.

  • public class JObjectSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                if (context.Type != typeof(JObject)) return;
                schema.Type = "object";
                schema.AdditionalProperties = null;
            }
        }
    


  • 다른 변경 사항이 열거형에 영향을 미쳤습니다. 열거형 필드 이름은 코드와 동일하지 않습니다. 숫자 1,2, ..., n으로 변경됩니다. 이 특이점을 수정하려면 ISchemaFilter의 다른 사용자 정의 구현을 만들어야 합니다.

  • public class EnumSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                if (!context.Type.IsEnum) return;
    
                var fields = context.Type.GetFields(BindingFlags.Static | BindingFlags.Public);
    
                schema.Enum = fields.Select(field => new OpenApiString(field.Name)).Cast<IOpenApiAny>().ToList();
                schema.Type = "string";
                schema.Properties = null;
                schema.AllOf = null;
            }
        }
    


  • 마지막으로 언급해야 할 사항은 사용자 지정 요청 개체의 일부 필드에 갑자기 [필수] 속성이 있다는 것입니다. 최선의 결정을 코딩했는지 확실하지 않지만 다음과 같이 작동했습니다.

  • public class SettingsSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                if (context.Type != typeof(Settings)) return;
                if (schema.Required == null || schema.Required.Count == 0)
                {
                    schema.Nullable = true;
                }
            }
        }
    


    내가 직면 한 모든 변화입니다.

    좋은 웹페이지 즐겨찾기