ASP. NET Web API - Swagger, создайте несколько представлений - PullRequest
1 голос
/ 09 апреля 2020

Я использую Swagger с ASP. NET приложением Web API. Если я захожу на URL http://localhost:5000/swagger

Swagger, перечисляю все контроллеры и действия, определенные в этих контроллерах. Допустим, у меня есть пять контроллеров, и у каждого контроллера есть одно действие. Я хочу создать несколько представлений таким образом, чтобы, когда

пользователь говорит http://localhost:5000/swagger/v1, он видит все контроллеры, когда пользователь говорит http://localhost:5000/swagger/v2, он видит только один контроллер, когда пользователь говорит http://localhost:5000/swagger/v3, он видит только два контроллера

В основном я пытаюсь ограничить доступ к контроллеру через чванство. Исходя из требований пользователя, я поделюсь с ними указанным c URL.

Возможно ли достичь этого с помощью Swagger?

1 Ответ

3 голосов
/ 09 апреля 2020

Да, вы можете делать именно то, что вы хотите.

Вы должны выполнить следующие шаги:

  1. Создать класс, который наследуется от IDocumentFilter и зарегистрировать его в SwaggerConfig.cs следующим образом c.DocumentFilter<HideSwaggerEndpointsDocumentFilter>();

Пример:

public class HideSwaggerEndpointsDocumentFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
    //enter code here
    }
}

Этот фильтр загружается после загрузки страницы чванства. Внутри него вы можете контролировать каждое действие контроллера. Вы можете удалить некоторые действия на основе любых критериев, выбранных вами.

Удалить их немного сложно, я делаю это следующим образом:
foreach (var apiDescription in apiExplorer.ApiDescriptions)
{
    var route = "/" + apiDescription.RelativePath.Substring(0, (apiDescription.RelativePath.IndexOf('?') != -1) ? apiDescription.RelativePath.IndexOf('?') : apiDescription.RelativePath.Length).TrimEnd('/');
    var path = swaggerDoc.paths[route];

    switch (apiDescription.HttpMethod.Method)
    {
        case "DELETE": path.delete = null; break;
        case "GET": path.get = null; break;
        case "HEAD": path.head = null; break;
        case "OPTIONS": path.options = null; break;
        case "PATCH": path.patch = null; break;
        case "POST": path.post = null; break;
        case "PUT": path.put = null; break;
        default: throw new ArgumentOutOfRangeException("Method name not mapped to operation");
    }

    if (path.delete == null && path.get == null &&
        path.head == null && path.options == null &&
        path.patch == null && path.post == null && path.put == null)
    {
        swaggerDoc.paths.Remove(route);
    }
}

Отказ от ответственности:
Если вы поместите вышеуказанный код в ваш класс DocumentFilter, он удалит все действия независимо от того, данный URL.

Итак, мы находимся на последнем этапе, где вы в основном делаете желаемую логику c.

Внутри (foreach (var apiDescription in apiExplorer.ApiDescriptions)) вы можете играть и делать свои собственные логи c. У вас есть доступ к HttpContext.Current, поэтому вы можете получить текущий URL.

Если вы не хотите удалять текущее действие, сделайте что-то подобное до swaggerDoc.paths.Remove(route);.

bool forDelete = false; // your custom logic when it should be deleted
if (!forDelete)
{
    return;
}

Надеюсь, это поможет вам.

...