Swashbuckle kullanarak WebAPI'da Swagger belgelerinden yöntemler nasıl çıkarılır


135

Swashbuckle kullanılarak otomatik olarak oluşturulan API belgelerine sahip bir C # ASP.NET WebAPI uygulamam var . Ben edebilmek istiyorum bazı yöntemleri ihmal belgelerinden ama Swagger UI çıktıda dahil etmemek Swagger anlatmak için nasıl çalışmak gibi olamaz.

Bir model veya şema filtresi eklemekle ilgili bir şey olduğunu hissediyorum, ancak ne yapılacağı açık değil ve dokümantasyon yalnızca bir yöntem için çıktının nasıl değiştirileceğine dair örnekler veriyor gibi görünüyor, onu çıktıdan tamamen çıkarmıyor.

Şimdiden teşekkürler.

Yanıtlar:


337

Denetleyicilere ve Eylemlere aşağıdaki özniteliği, onları oluşturulan belgelerin dışında bırakmak için ekleyebilirsiniz: [ApiExplorerSettings(IgnoreApi = true)]


12
Harika çalıştı, cevap bu olmalı
JohnC

4
Bunu programlı olarak yapmanın bir yolu var mı? Bir yapılandırma ayarına göre bir API'yi bazı ortamlarda açığa çıkarmak istiyorum ancak diğerlerinde göstermiyorum.
Paul Kienitz

@SyaifulNizamYahya Emin değilim. Belki [JsonIgnore]?
mikesigs

@mikesigs Evet [JsonIgnore] çalışıyor. Maalesef serileştirmeyi yasaklıyor.
Syaiful Nizam Yahya

4
Swashbuckle belgeleri: Keyfi İşlemleri Atla
spottedmahn

17

Birisi çözümü github'da yayınladı, bu yüzden buraya yapıştıracağım. Tüm krediler ona gidiyor. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

Önce bir Öznitelik sınıfı oluşturun

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

Ardından bir Belge Filtresi sınıfı oluşturun

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);
        }
    }
}

Daha sonra Swagger Config sınıfında bu belge filtresini ekleyin

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

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

Son adım, Swashbuckle'ın dokümantasyon oluşturmasını istemediğiniz Controller veya Method'a [HideInDocsAttribute] özniteliğini eklemektir.


1
RemoveRoute'un aradığım droid olabileceğini düşünüyorum.
Paul Kienitz

13

Bir belge filtresiyle oluşturulduktan sonra havalı belgeden "işlemleri" kaldırabilirsiniz - sadece fiili olarak ayarlayın null(ancak bunu yapmanın başka yolları da olabilir)

Aşağıdaki örnek yalnızca GETfiillere izin verir ve bu sayıdan alınmıştır .

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;
        }
    }
}

ve havalı yapılandırmanızda:

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

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

1
Not: Bu, açıklamayı kaldırsanız bile yolu kaldırmayacaktır path.get = null;- sonuç olarak bu yollar Swagger dosyasına dahil edilecektir, ancak ayrıntılar olmadan. ApiExplorerSettingsAttributeGitHub'daki orijinal cevabınızda belirttiğiniz gibi cevabınıza eklemeniz daha iyi olabilir . ApiExplorerSettings'i kullanmak, tür bilgilerinin Swagger dosyasının schemeslistesine eklenmesini de önleyebilir .
JBert

7

Yol öğeleri için sözlük girişlerini tamamen kaldırmayı tercih ederim:

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

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

Bu yaklaşımla, oluşturulan swagger.json tanımında "boş" öğeler almazsınız.


3

Bir filtre yapın

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);
            }
        }
    }
}

Bir öznitelik oluşturun

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

Startup.cs dosyasında uygula

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

Swagger JSON'a dahil etmek istediğiniz yöntemlere ve denetleyicilere [SwaggerTag] özniteliğini ekleyin


Tatlı. Uygun yaklaşım ve sln'yi paylaştığınız için teşekkür ederiz.
Vedran Mandić

2

Birisine yardımcı olabilir, ancak geliştirme sırasında (hata ayıklama) tüm Denetleyicileri ve / veya Eylemleri ortaya çıkarmayı ve ardından bunları üretim sırasında gizlemeyi severiz (sürüm oluşturma)

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

1

@Spottedmahns cevabına göre . Benim görevim tam tersiydi. Yalnızca izin verilenleri gösterin.

Çerçeveler: .NetCore 2.1; Swagger: 3.0.0

Özellik eklendi

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

Ve özel IDocumentFilter uygulayın

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 kodu:

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

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

Teşekkürler Aleha. Bu yaklaşım, ApiExplorerSettingsAttribute'un çalışmadığı SwashBuckle.OData için gerçekten işe yarar.
Prasad Korhale

1

bir satır SwaggerConfig c.DocumentFilter () ekleyin;

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);
}
    }
}

0

Bunu, atlamak istediğiniz Yöntemlerinizin üzerine ekleyin.

[ApiExplorerSettings(IgnoreApi=true)]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.