我有一个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代码做错了?