c# - 使用自定义命名策略生成 Swagger 定义的问题
问题描述
我有一个 OData Web API,我正在使用 Swashbuckle 和 Swagger 来生成和显示 Web API 文档。这正在工作并产生很好的定义名称,如下所示:
- 用户
- 角色
- 允许
- ODataResponse[列表[权限]]
- 坐标系
- ETC...
添加一些新对象和控制器后,我遇到了“冲突的 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.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
- 坐标系
- Microsoft.Spatial.CoordinateSystem
现在的问题是“ODataResponse`1”。我期待“ODataResponse[List[Permission]]”,但它只显示 Swashbuckle.OData 定义的名称。还有其他选项 - 我尝试了 t.FullName、t.Name、t.AssemblyQualifiedName、t.Namespace,但都没有产生预期的结果。
我确实想出了一个使用自定义命名策略的解决方案,但它看起来很糟糕并且超级hacky:
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 代码做错了什么?
解决方案
推荐阅读
- ios - 使用 swift 4 退出应用程序并返回主屏幕
- file - 通过流集从不断更新的文件中读取数据
- c# - 将 www 重定向到非 www url
- android - 如何在库模块中使用不同的包名称进行调试和发布?
- javascript - 将 html 表格行中断到下一行以转换为 pdf
- c# - 从列表中移除和 API 的使用
- c# - ListView/GridView 未扩展以填充可用空间
- jquery - 在段落标签中设置最大字符数限制
- c# - 我想通过 C# 中的 selenium 读取文本并将其存储在变量中
- java - 带有伴随对象的 Kotlin 枚举类与 Firebase 数据库的字段集成