使用自定义命名策略生成Swagger定义时出现问题

时间:2019-05-03 20:58:42

标签: c# swagger odata swashbuckle

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

  • 用户
  • 角色
  • 权限
  • ODataResponse [List [Permission]]
  • 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,但均未产生预期的结果。

我确实提出了一种使用自定义命名策略的解决方案,但是它看起来很可怕并且非常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代码做错了?

0 个答案:

没有答案