Схема фильтрации из NSwag swagger - PullRequest
0 голосов
/ 21 февраля 2019

У меня полнофункциональное приложение ASP.NET с конечными точками API.Я использую NSwag для создания чванства документа.Это все работает.

Мне нужно создать документ только для небольшого подмножества конечных точек.Пути отфильтрованы, а схема - нет.Как отфильтровать объекты схемы в соответствии с фильтрацией путей?

Пример: у меня есть этот фильтр

    public class IncludeControllersInSwagger : IOperationProcessor
    {
        public Task<bool> ProcessAsync(OperationProcessorContext context)
        {
            return Task.FromResult(
                context.ControllerType == typeof(ControllerA));
        }
    }

И это при запуске:
settings.GeneratorSettings.OperationProcessors.Add(new IncludeControllersInSwagger());

Контроллеры:

    public class AResponse
    {
        public string Message { get; set; }
        public bool Flag { get; set; }
    }

    public class BResponse
    {
        public string Message { get; set; }
        public int Count { get; set; }
    }

    [Route("a")]
    public class ControllerA : ApiController
    {
        [HttpGet]
        public AResponse Get()
        {
            return new AResponse
            {
                Message = "Hello from A",
                Flag = true
            };
        }
    }

    [Route("b")]
    public class ControllerB : ApiController
    {
        [HttpGet]
        public BResponse Get()
        {
            return new BResponse
            {
                Message = "Hello from B",
                Count = 42
            };
        }
    }

Тогда сгенерированный чванство содержит только один путь:

  "paths": {
    "/a": {
      "get": {  .. etc
    }
  }

И это все, это правильно.

Но схемы содержат оба:

 "schemas": {
      "AResponse": {
        "type": "object",
        "additionalProperties": false,
 etc
      },
      "BResponse": {
        "type": "object",
        "additionalProperties": false,
etc
        }
      }
    }

Тип BResponse не должен быть там. Как его удалить?

Эти дополнительные данные делаютСекция схем чрезвычайно многословна и непригодна для публичной документации в случае, когда существует более 10 конечных точек, и только 2 из них открыты через шлюз и поэтому задокументированы в swagger.

Существует ISchemaProcessor, но он не возвращаетсялогическое значение типа IOperationProcessor.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

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

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

Затем измените ваш процессор для поиска этого атрибута:

public class IncludeInSwaggerOperationProcessor : IOperationProcessor
{
    public async Task<bool> ProcessAsync(OperationProcessorContext context)
    {
        return context.ControllerType.GetCustomAttributes<IncludeInSwaggerAttribute>().Any() || 
               context.MethodInfo.GetCustomAttributes<IncludeInSwaggerAttribute>().Any();
    }
}

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

0 голосов
/ 27 февраля 2019

Вы пытались добавить фильтр операций в качестве первого элемента?

т.е. OperationProcessors.Insert(0, new IncludeControllersInSwagger())

Я думаю, что это важно, так как это отфильтрует операцию до того, как схемы dto будут сгенерированы и добавлены в документ.

...