У меня есть 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?