Проблема генерации определений Swagger с использованием пользовательской стратегии именования - PullRequest
0 голосов
/ 03 мая 2019

У меня есть OData Web API, и я использую Swashbuckle и Swagger для генерации и отображения документации по Web API.Это работало и создавало хорошие имена определений, например:

  • Пользователь
  • Роль
  • Разрешение
  • ODataResponse [Список [Разрешение]]
  • CoordinateSystem
  • И т.д. ...

Я столкнулся с проблемой «Конфликтующие schemaIds» после добавления некоторых новых объектов и контроллеров и начал получать эту ошибку:

System.InvalidOperationException: 'Conflicting schemaIds: Duplicate schemaIds detected for types Microsoft.Spatial.CoordinateSystem and MyProject.CoordinateSystem. See the config setting - "UseFullTypeNameInSchemaIds" for a potential workaround'

Как говорится об ошибке, я добавил следующую строку в SwaggerConfig.cs

c.UseFullTypeNameInSchemaIds();

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

  • MyProject.User
  • MyProject.Role
  • MyProject.Permission
  • Swashbuckle.OData.ODataResponse [System.Collections.Generic.List [MyProject.Permission]]
  • MyProject.CoordinateSystem
  • Microsoft.Spatial.CoordinateSystem

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

Затем я попытался использовать пример пользовательской стратегии, представленный в SwaggerConfig.cs, для переименования одного из конфликтующих имен определений:

c.SchemaId(t => t.FullName.Contains("Microsoft.Spatial.CoordinateSystem") 
    ? t.FullName : t.Name);

Это работает для противоречивых определений, так как использует полное имя для «Microsoft.Spatial.CoordinateSystem», и я получаю это сейчас:

  • Пользователь
  • Роль
  • Разрешение
  • ODataResponse`1
  • CoordinateSystem
  • Microsoft.Spatial.CoordinateSystem

Проблема сейчасэто "ODataResponse`1".Я ожидаю «ODataResponse [List [Permission]]», но он отображает только имя определения Swashbuckle.OData.Есть и другие варианты - я попробовал t.FullName, t.Name, t.AssemblyQualifiedName, t.Namespace, но ни один из них не дал желаемых результатов.

Я нашел решение, которое работает с использованием пользовательской стратегии именования, ноэто выглядит ужасно и супер хакерски:

c.SchemaId(t => t.FullName.Contains("System.Collections.Generic.List") ? 
    "ODataResponse[List[" + 
    t.FullName.Substring(t.FullName.IndexOf("MyProject.") + 10, (t.FullName.IndexOf(",") - 10 - t.FullName.IndexOf("MyProject.")))
    + "]]" 
    : (t.FullName.Contains("Microsoft.Spatial.CoordinateSystem") ? t.FullName : t.Name));

Кажется ли это ошибкой в ​​Swagger / Swashbuckle или я что-то не так делаю с кодом c.SchemaId?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...