कैसे Swashbuckle का उपयोग करके WebAPI पर स्वैगर प्रलेखन से तरीकों को छोड़ना है


135

मेरे पास एक C # ASP.NET WebAPI एप्लिकेशन है जिसमें एपीआई प्रलेखन स्वशबकल का उपयोग करके स्वचालित रूप से जेनरेट किया जा रहा है । मैं दस्तावेज़ीकरण से कुछ विधियों को छोड़ना चाहता हूं , लेकिन स्वैगर को यह बताने के लिए तैयार नहीं हो सकता कि स्वैगर यूआई आउटपुट में उन्हें कैसे शामिल नहीं किया जाए।

मुझे लगता है कि यह एक मॉडल या स्कीमा फ़िल्टर को जोड़ने के साथ कुछ करना है, लेकिन यह स्पष्ट नहीं है कि क्या करना है और प्रलेखन केवल एक विधि के लिए आउटपुट को संशोधित करने के उदाहरण प्रदान करता है, न कि इसे आउटपुट से पूरी तरह से हटा दें।

अग्रिम में धन्यवाद।

जवाबों:


337

आप उन्हें उत्पन्न दस्तावेज़ से बाहर करने के लिए नियंत्रकों और क्रियाओं में निम्नलिखित विशेषता जोड़ सकते हैं: [ApiExplorerSettings(IgnoreApi = true)]


12
महान काम किया, यह उत्तर होना चाहिए
JohnC

4
क्या प्रोग्रामेटिकली ऐसा करने का कोई तरीका है? मैं एक विन्यास के अनुसार कुछ वातावरणों में एक एपीआई को उजागर करना चाहता हूं लेकिन दूसरों में नहीं।
पॉल कियनिट्ज

@SyaifulNizamYahya यकीन नहीं होता। शायद [JsonIgnore]?
mikesigs

@mikesigs हाँ [JsonIgnore] काम करता है। दुर्भाग्य से, यह क्रमिक निषेध है।
सियाफुल निज़ाम याहया

4
Swashbuckle प्रलेखन:
ओमिट आर्बिटवर्स

17

किसी ने गितुब पर समाधान पोस्ट किया है इसलिए मैं इसे यहां पेस्ट करने जा रहा हूं। सारा श्रेय उसी को जाता है। 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);
        }
    }
}

फिर स्वैगर कॉन्फिगरेशन क्लास में, उस डॉक्यूमेंट फ़िल्टर को जोड़ें

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

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

अंतिम चरण नियंत्रक या विधि पर [HideInDocsAttribute] विशेषता जोड़ना है जो आप दस्तावेज़ उत्पन्न करने के लिए Swashbuckle नहीं चाहते हैं।


1
मुझे लगता है कि RemoveRoute मैं जिस droid की तलाश में हूं, हो सकता है।
पॉल किंइट्ज

13

दस्तावेज़ फ़िल्टर के साथ उत्पन्न होने के बाद आप स्वैगर दस्तावेज़ से "ऑपरेशन" निकाल सकते हैं - बस क्रिया को सेट करें 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;
        }
    }
}

और आपके स्वैगर कॉन्फ़िगरेशन में:

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

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

1
ध्यान दें: यह पथ को हटा नहीं देगा भले ही आप असहज हों path.get = null;- परिणामस्वरूप उन पथों को अभी भी स्वैगर फ़ाइल में शामिल किया जाएगा, लेकिन केवल विवरण के बिना। ApiExplorerSettingsAttributeआपके उत्तर में इसे शामिल करना बेहतर हो सकता है क्योंकि आपने इसका उल्लेख GitHub पर अपने मूल उत्तर में किया था। 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
{
}

स्टार्टअप में लागू करें

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

[SwaggerTag] उन विधियों और नियंत्रकों में जोड़ें, जिन्हें आप स्वैगर JSON में शामिल करना चाहते हैं


मिठाई। उपयुक्त दृष्टिकोण और sln साझा करने के लिए धन्यवाद।
वेदरन मांडिक

2

किसी की मदद कर सकते हैं लेकिन विकास (डिबगिंग) के दौरान हम पूरे नियंत्रकों और / या क्रियाओं को उजागर करना पसंद करते हैं और फिर उत्पादन (रिलीज़ बिल्ड) के दौरान इन्हें छिपाते हैं

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

1

@Spottedmahns उत्तर के आधार पर । मेरा काम इसके विपरीत था। केवल उन्हीं को दिखाएं जिनकी अनुमति है।

फ्रेमवर्क:। नेटकोर 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);
            }
        }
    }
}

कॉन्फ़िगर सेवा कोड:

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

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

धन्यवाद अलेहा। यह दृष्टिकोण वास्तव में SwashBuckle.OData के लिए अच्छा काम करता है जहां ApiExplorerSettingsAttribute काम नहीं करता है।
प्रसाद कोरले

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.