首页 > 解决方案 > 使用自定义命名策略生成 Swagger 定义的问题

问题描述

我有一个 OData Web API,我正在使用 Swashbuckle 和 Swagger 来生成和显示 Web API 文档。这正在工作并产生很好的定义名称,如下所示:

添加一些新对象和控制器后,我遇到了“冲突的 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();

这修复了错误,但导致我的定义名称出现了一些问题。现在它们显示如下:

现在倒数第三个是有问题的,因为它对于读取此信息的应用程序来说太长了。

接下来,我尝试使用 SwaggerConfig.cs 中提供的自定义策略示例来重命名冲突的定义名称之一:

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

这适用于冲突的定义,因为它使用“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 代码做错了什么?

标签: c#swaggerodataswashbuckle

解决方案


推荐阅读