Swashbuckle을 사용하여 WebAPI의 Swagger 문서에서 메소드를 생략하는 방법


135

Swashbuckle을 사용하여 API 문서가 자동으로 생성되는 C # ASP.NET WebAPI 응용 프로그램이 있습니다. 설명서에서 특정 방법생략 하고 싶지만 Swagger가 Swagger UI 출력에 포함시키지 않도록 Swagger에 지시하는 방법을 알아낼 수 없습니다.

나는 그것이 모델이나 스키마 필터추가하는 것과 관련이 있다고 생각하지만 무엇을 해야할지 명확하지 않으며 문서는 메소드의 출력을 수정하는 방법의 예를 제공하는 것만으로 출력에서 ​​완전히 제거하지는 않습니다.

미리 감사드립니다.

답변:


337

다음 속성을 컨트롤러 및 조치에 추가하여 생성 된 문서에서 제외 할 수 있습니다. [ApiExplorerSettings(IgnoreApi = true)]


12
훌륭하게 작동했습니다. 이것이 답이되어야합니다
JohnC

4
프로그래밍 방식 으로이 작업을 수행하는 방법이 있습니까? 구성 설정에 따라 일부 환경에서는 API를 노출하고 싶지만 다른 환경에서는 API를 노출하고 싶지 않습니다.
Paul Kienitz

@SyaifulNizamYahya 확실하지 않습니다. 아마 [JsonIgnore]?
mikesigs

@ mikesigs 예 [JsonIgnore] 작동합니다. 불행하게도, 그것은 직렬화를 금지합니다.
Syaiful Nizam Yahya

4
Swashbuckle 문서 : 임의의 작업 생략
spottedmahn

17

누군가가 github에 솔루션을 게시 했으므로 여기에 붙여 넣을 것입니다. 모든 크레딧은 그에게갑니다. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

먼저 속성 클래스 작성

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute : Attribute
{
}

그런 다음 문서 필터 클래스를 작성하십시오.

public class HideInDocsFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        foreach (var apiDescription in apiExplorer.ApiDescriptions)
        {
            if (!apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any() && !apiDescription.ActionDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any()) continue;
            var route = "/" + apiDescription.Route.RouteTemplate.TrimEnd('/');
            swaggerDoc.paths.Remove(route);
        }
    }
}

그런 다음 Swagger Config 클래스에서 해당 문서 필터를 추가하십시오.

public class SwaggerConfig
{
    public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        config
             .EnableSwagger(c =>
                {
                    ...                       
                    c.DocumentFilter<HideInDocsFilter>();
                    ...
                })
            .EnableSwaggerUi(c =>
                {
                    ...
                });
    }
}

마지막 단계는 Swashbuckle이 문서를 생성하지 못하게하는 컨트롤러 또는 메소드에 [HideInDocsAttribute] 속성을 추가하는 것입니다.


1
RemoveRoute가 내가 찾고있는 드로이드 일 수 있다고 생각합니다.
Paul Kienitz

13

문서 필터로 생성 된 후 swagger 문서에서 "작업"을 제거 할 수 있습니다. 동사를 설정하십시오 null(다른 방법도있을 수 있음).

다음 샘플은 GET동사 만 허용 하며이 문제 에서 가져옵니다 .

class RemoveVerbsFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
        foreach (PathItem path in swaggerDoc.paths.Values)
        {
            path.delete = null;
            //path.get = null; // leaving GET in
            path.head = null;
            path.options = null;
            path.patch = null;
            path.post = null;
            path.put = null;
        }
    }
}

그리고 swagger 설정에서 :

...EnableSwagger(conf => 
{
    // ...

    conf.DocumentFilter<RemoveVerbsFilter>();
});

1
참고 : 주석 처리를 제거하더라도 경로가 제거되지 않으므로 path.get = null;결과적으로 해당 경로는 Swagger 파일에 포함되지만 세부 정보는 포함되지 않습니다. ApiExplorerSettingsAttributeGitHub의 원래 회신에 언급 한대로 답변 에 포함하는 것이 좋습니다 . ApiExplorerSettings를 사용하면 Swagger 파일 schemes목록에 유형 정보가 추가되지 않을 수도 있습니다 .
JBert

7

경로 항목의 사전 항목을 완전히 제거하고 싶습니다.

var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => !pathItem.Key.Contains("api/"))
                .ToList();

foreach (var item in pathsToRemove)
{
    swaggerDoc.Paths.Remove(item.Key);
}

이 방법을 사용하면 생성 된 swagger.json 정의에 "빈"항목이 표시되지 않습니다.


3

필터 만들기

public class SwaggerTagFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        foreach(var contextApiDescription in context.ApiDescriptions)
        {
            var actionDescriptor = (ControllerActionDescriptor)contextApiDescription.ActionDescriptor;

    if(!actionDescriptor.ControllerTypeInfo.GetCustomAttributes<SwaggerTagAttribute>().Any() && 
    !actionDescriptor.MethodInfo.GetCustomAttributes<SwaggerTagAttribute>().Any())
            {
                var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
            swaggerDoc.Paths.Remove(key);
            }
        }
    }
}

속성 만들기

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SwaggerTagAttribute : Attribute
{
}

startup.cs에 적용

 services.AddSwaggerGen(c => {
            c.SwaggerDoc(1,
                new Info { Title = "API_NAME", Version = "API_VERSION" });
            c.DocumentFilter<SwaggerTagFilter>(); // [SwaggerTag]
        });

Swagger JSON에 포함하려는 메소드 및 컨트롤러에 [SwaggerTag] 속성 추가


단. 적절한 접근 방식과 sln을 공유해 주셔서 감사합니다.
Vedran Mandić '12

2

누군가를 도울 수 있지만 개발 (디버깅) 중에 우리는 전체 컨트롤러 및 / 또는 액션을 노출시키고 프로덕션 (릴리스 빌드) 중에 숨길 수 있습니다.

#if DEBUG
    [ApiExplorerSettings(IgnoreApi = false)]
#else
    [ApiExplorerSettings(IgnoreApi = true)]
#endif  

1

@spottedmahns 답변을 기반으로 합니다. 내 임무는 그 반대였습니다. 허용 된 것만 표시하십시오.

프레임 워크 : .NetCore 2.1; 스와 거 : 3.0.0

추가 된 속성

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class ShowInSwaggerAttribute : Attribute
{
}

사용자 정의 IDocumentFilter를 구현하십시오.

public class ShowInSwaggerFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {

        foreach (var contextApiDescription in context.ApiDescriptions)
        {
            var actionDescriptor = (ControllerActionDescriptor) contextApiDescription.ActionDescriptor;

            if (actionDescriptor.ControllerTypeInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any() ||
                actionDescriptor.MethodInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any())
            {
                continue;
            }
            else
            {
                var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
                var pathItem = swaggerDoc.Paths[key];
                if(pathItem == null)
                    continue;

                switch (contextApiDescription.HttpMethod.ToUpper())
                {
                    case "GET":
                        pathItem.Get = null;
                        break;
                    case "POST":
                        pathItem.Post = null;
                        break;
                    case "PUT":
                        pathItem.Put = null;
                        break;
                    case "DELETE":
                        pathItem.Delete = null;
                        break;
                }

                if (pathItem.Get == null  // ignore other methods
                    && pathItem.Post == null 
                    && pathItem.Put == null 
                    && pathItem.Delete == null)
                    swaggerDoc.Paths.Remove(key);
            }
        }
    }
}

ConfigureServices 코드 :

public void ConfigureServices(IServiceCollection services)
{
     // other code

    services.AddSwaggerGen(c =>
    {
        // other configurations
        c.DocumentFilter<ShowInSwaggerFilter>();
    });
}

감사합니다 Aleha. 이 방법은 실제로 AwashExplorerSettingsAttribute가 작동하지 않는 SwashBuckle.OData에 효과적입니다.
Prasad Korhale 2016 년

1

한 줄 추가 SwaggerConfig c.DocumentFilter ();

public class HideInDocsFilter : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        { 
var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => !pathItem.Key.Contains("api/"))
                .ToList();

foreach (var item in pathsToRemove)
{
    swaggerDoc.Paths.Remove(item.Key);
}
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.