Swashbuckle очень медленно для большой схемы - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть база данных с более чем 90 таблицами, и все таблицы перекрестно связаны друг с другом с помощью внешних ключей.

Когда я открываю страницу сваггера для своего API, загрузка занимает более 2 минут. Причина, по-видимому, заключается в том, что он генерирует Модель и Пример значения для каждого API. Из-за перекрестных связей каждая сущность ссылается на любую другую сущность (путем рекурсивного транзитивного замыкания)!

Есть ли способ отключить или ограничить рекурсию, когда сваггер генерирует Модель и Пример значения ?

Например,

class A {
   int id;
   List<B> Blist;
}

class B {
   int id;
   List<C> Clist;
}

class C {
   int id;
   List<D> Dlist;
}

/// etc...

Если у меня есть API для GET /api/A, тогда я не хочу вставлять все классы на страницу сваггера Модель . Это слишком огромно! Я только хочу тянуть в А.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Ответ на ваш вопрос короткий

Есть ли способ ограничить рекурсию, когда swagger генерирует Модель и Пример?

К сожалению, нет!

В настоящее время такой опции нет. Но это возможно, и мы это обсуждаем:
https://github.com/swagger-api/swagger-ui/issues/4411
Добавьте туда комментарий и +1 к этой проблеме, сообщите команде, что это важно для вас.

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

Теперь ваша версия (2.x) больше не поддерживается, поэтому там не будет исправлений ...
Вы пробовали Swagger-Net ? Это моя вилка, и я использую последнюю версию пользовательского интерфейса

0 голосов
/ 28 апреля 2018

Вот взлом, который, кажется, "исправить" это. Я добавил это к своему SwaggerConfig.cs

  c.MapType<MasterModel>(() => new Schema { type = "integer", format = "int32" });
  c.MapType<MasterLocationModel>(() => new Schema { type = "integer", format = "int32" });
  c.MapType<LocationModel>(() => new Schema { type = "integer", format = "int32" });

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

Возможно, есть способ сделать это лучше, используя SchemaFilter? Любая помощь будет оценена.

EDIT:

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

class A_Base {
   int id;
}

class A : A_Base {
   List<B_Base> Blist;
}

class B_Base {
   int id;
}

class B : B_Base {
   List<C_Base> Clist;
}

class C_Base {
   int id;
}

class C : C_Base {
   List<D_Base> Dlist;
}

и все наши API контроллеров используют типы A, B, C. Документ Swagger будет углубляться только на один уровень. Рекурсия не выходит из-под контроля. Также это более правильно, потому что объекты, возвращаемые нашим API, обычно имеют нулевой или один уровень глубины.

...