Cách bỏ qua các phương thức từ tài liệu Swagger trên WebAPI bằng Swashbuckle


134

Tôi có một ứng dụng CAP ASP.NET WebAPI với tài liệu API được tạo tự động bằng Swashbuckle . Tôi muốn có thể bỏ qua một số phương thức nhất định từ tài liệu nhưng dường như tôi không thể tìm ra cách bảo Swagger không đưa chúng vào đầu ra UI Swagger.

Tôi cảm thấy đó là một cái gì đó để làm với việc thêm một mô hình hoặc bộ lọc lược đồ nhưng không rõ ràng phải làm gì và tài liệu dường như chỉ cung cấp các ví dụ về cách sửa đổi đầu ra cho một phương thức, không loại bỏ nó hoàn toàn khỏi đầu ra.

Cảm ơn trước.

Câu trả lời:


336

Bạn có thể thêm thuộc tính sau vào Bộ điều khiển và Hành động để loại trừ chúng khỏi tài liệu được tạo: [ApiExplorerSettings(IgnoreApi = true)]


12
Làm việc tuyệt vời, đây sẽ là câu trả lời
JohnC

4
Có cách nào để làm điều này theo chương trình? Tôi muốn hiển thị API trong một số môi trường nhưng không phải trong các môi trường khác, theo cài đặt cấu hình.
Paul Kiênitz

@SyaifulNizamYahya Không chắc chắn. Có lẽ [JsonIgnore]?
mikeigs

@mikeigs Có [JsonIgnore] hoạt động. Thật không may, nó cấm tuần tự hóa.
Nizam Yahya Syaiful

4
Tài liệu về Swashbuckle:
Omit

17

Ai đó đã đăng giải pháp lên github vì vậy tôi sẽ dán nó ở đây. Tất cả các khoản tín dụng cho anh ta. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

Tạo đầu tiên một lớp thuộc tính

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

Sau đó tạo lớp Lọc tài liệu

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

Sau đó, trong lớp Swagger Config, thêm bộ lọc tài liệu đó

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

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

Bước cuối cùng là thêm thuộc tính [HideInDocsAttribution] trên Trình điều khiển hoặc Phương thức mà bạn không muốn Swashbuckle tạo tài liệu.


1
Tôi nghĩ rằng RemoveRoute có thể là droid tôi đang tìm kiếm.
Paul Kienitz

13

Bạn có thể xóa "thao tác" khỏi tài liệu vênh sau khi được tạo bằng bộ lọc tài liệu - chỉ cần đặt động từ thành null (mặc dù, có thể có nhiều cách khác để làm điều đó)

Mẫu sau chỉ cho phép các GETđộng từ - và được lấy từ vấn đề này .

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

và trong cấu hình vênh vang của bạn:

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

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

1
Lưu ý: điều này sẽ không xóa đường dẫn ngay cả khi bạn không chú ý path.get = null;- kết quả là các đường dẫn đó vẫn sẽ được đưa vào tệp Swagger nhưng chỉ không có chi tiết. Có thể tốt hơn là bao gồm ApiExplorerSettingsAttributecâu trả lời của bạn khi bạn đề cập nó trong câu trả lời ban đầu của bạn trên GitHub. Sử dụng ApiExplorerS Settings cũng có thể tránh thông tin loại được thêm vào schemesdanh sách của tệp Swagger .
JBert

7

Tôi muốn loại bỏ hoàn toàn các mục từ điển cho các mục đường dẫn:

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

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

Với phương pháp này, bạn sẽ không nhận được các mục "trống" trong định nghĩa swagger.json được tạo.


3

Tạo bộ lọc

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

Tạo một thuộc tính

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

Áp dụng trong startup.cs

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

Thêm thuộc tính [SwaggerTag] vào các phương thức và bộ điều khiển bạn muốn đưa vào Swagger JSON


Ngọt. Cách tiếp cận phù hợp và cảm ơn bạn đã chia sẻ sln.
Vedran Mandić

2

Có thể giúp đỡ ai đó nhưng trong quá trình phát triển (gỡ lỗi), chúng tôi muốn phơi bày toàn bộ Bộ điều khiển và / hoặc Hành động và sau đó ẩn chúng trong quá trình sản xuất (phát hành bản dựng)

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

1

Dựa trên câu trả lời @spiatedmahns . Nhiệm vụ của tôi là ngược lại. Chỉ hiển thị những người được phép.

Các khung: .NetCore 2.1; Vênh vang: 3.0.0

Đã thêm thuộc tính

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

Và triển khai IDocumentFilter tùy chỉnh

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

cấu hình dịch vụ :

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

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

Cảm ơn Aleha. Cách tiếp cận này thực sự hoạt động tốt cho SwashBuckle.OData nơi ApiExplorerSinstallAttribution không hoạt động.
Prasad Korhale

1

thêm một dòng 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);
}
    }
}

0

Thêm phần này vào đầu Phương thức mà bạn muốn bỏ qua-

[ApiExplorerSettings(IgnoreApi=true)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.