2015-04-17 15 views
33

Otomatik olarak oluşturulmuş bir C# ASP.NET WebAPI uygulaması var Swashbuckle kullanarak otomatik olarak oluşturulur. 'un belgelere göre belirli yöntemlerini göz ardı etmek istiyorum ama Swagger'a Swagger UI çıkışına bunları dahil etmemesini söyleyemiyorum.Swashbuckle'ı kullanarak WebAPI'da Swagger belgelerinden nasıl yöntem atlamak nasıl?

bir model veya şema filtresi ekleyerek eklenmesi gereken bir şey olduğunu biliyorum, ancak ne yapması gerektiği açık değil ve yalnızca bir yöntem için çıktının nasıl değiştirileceğine dair örnekler sağlanmış gibi görünüyor. tamamen çıktıdan.

Şimdiden teşekkürler.

Bunu bir belge filtresi ile Oluşturulan sonra dayı belgeden "operasyonları" kaldırabilir
+2

Bu soruya kim düştü ve neden? Akıl yürütmeyi açıklamaya cömert davranır mısın lütfen. –

cevap

10

- sadece null için fiil set (gerçi yanı bunu yapmak için başka yollar olabilir)

Aşağıdaki örnek verir yalnızca GET fiiller - ve this issue'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 dayı config

:

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

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

Not: bu, 'path.get = null; 'uncomment olmasanız bile yolu kaldırmaz, sonuç olarak bu yollar Swagger dosyasına dahil edilir, ancak sadece detaylar olmadan. GitHub'daki orijinal cevabınızdaki cevabınızdaki yanıtınıza "ApiExplorerSettingsAttribute" eklenmesi daha iyi olabilir. ApiExplorerSettings'i kullanmak, Swagger dosyasının "şemaları" listesine eklenecek türden bilgi de alabilir. – JBert

+0

bunu paylaştığınız için çok teşekkürler. onun güzel bir örneği. – user2768132

0

Tamamen yol öğeleri için sözlük entires kaldırmak için tercih ediyorum: Eğer "boş almak değildir, Bu yaklaşımla

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

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

"oluşturulan swagger.json tanımındaki öğeler.

44

Oluşturulan belgelere dışında tutmak Kontrolörleri ve Eylemler aşağıdaki özniteliği ekleyebilirsiniz: Ben buraya yapıştırın gidiyorum böylece [ApiExplorerSettings(IgnoreApi = true)]

+1

bir çekicilik gibi çalışır! :) – msk

+1

Çalışmak harika, bu cevap – JohnC

+0

olmalıdır Programatik olarak bunu yapmanın bir yolu var mı?Bir yapılandırma ayarına göre, bazı ortamlarda bir API'yi göstermek istiyorum, ancak başkalarında değil. –

6

Birisi github çözüm yayınlanmıştır. Tüm krediler ona gider. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

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

Sonra oluşturmak bir Özellik sınıfı ilk Swagger Yapılandırma sınıfında

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

Sonra Belge Filtre sınıfı oluşturma

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 olduğunu belge filtre ekleyin Denetleyici veya Yöntemde [HideInDocsAttribute] özniteliğini ekleme Swashbuckle'un belge üretmesini istemiyorsunuz.

+0

Sanırım RemoveRoute aradığım droid olabilir. –

İlgili konular