【发布时间】:2018-12-10 12:01:55
【问题描述】:
我有一个 .Net Core 2.2 OData API,我正准备为此实现 Swagger 文档。
我一直在关注这个例子:https://github.com/Microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerODataSample
我已经让它工作到一定程度。 现在我遇到了一个问题,我的模型以循环方式相互引用,让我解释一下:
注意:我使用 EFCore 代码优先方法来处理我的数据库。
我有这些模型(例如):Project、ProjectLocation、ProjectRegion。 让我们称它们为 A、B 和 C 以保持简短。
A 像这样引用 B 和 C:
public virtual ICollection<X> X{ get; set; }
B 和 C 都直接引用 A:
public A A{ get; set; }
这都是非常标准的关系数据库模型,但 SwaggerUI 似乎无法处理。
我得到的错误如下:
未能加载 API 定义。 错误: 获取错误: 内部服务器错误 /swagger/v1/swagger.json
处理请求时发生未处理的异常。 TypeLoadException:无法从程序集“Tc2fc56a7babe40419a678a075439246c.DynamicModels,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“NCCRD.Services.DataV2.Database.Models.ProjectLocation”。
System.Signature.GetSignature(Void* pCorSig, int cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
如果需要,也可以使用堆栈跟踪。
我已尽我所能阅读了这两篇文章和所有参考链接,但没有找到可行的解决方案:
https://github.com/swagger-api/swagger-codegen/issues/741
https://github.com/swagger-api/swagger-codegen/issues/728
曾经看起来不错的解决方案是:https://systemout.net/2017/04/07/swagger-asp-net-core-fixing-circular-self-references/,但这也没有效果。 (我也联系过作者寻求帮助)
当我从 B 或 C 中删除对 A 的引用时,SwaggerUI 就会正常加载。
如果有人能对此有所了解,我将不胜感激。 在此先感谢您提供的任何帮助。
【问题讨论】:
-
不返回或接受 WebApi 端点上的实体。
-
我已经这样做了,而且必须这样做。这是客户使用的现有 API,我只是想将 Swagger 添加到组合中。使用 Swashbuckle 曾经很容易,但因为我现在同时使用 Odata 和 .Net Core,所以 Swashbuckle 不再是一个选项,afaik。
-
这可能是 OData API Explorer 中的一个错误。大多数(如果不是全部)Swagger 生成器使用反射来执行它们的工作,而 OData 使用 EDM 来确定模型在网络上的样子。因此,从相应的 CLR 类型生成的 Swagger 文档可能与 EDM 类型不同,这将是错误。 OData API Explorer 在需要时使用与 EDM 类型匹配的代理项替换 CLR 类型。正在调查此问题的原因。同时,解决方法应该是使用与 EDM 完全匹配的响应类型。
标签: asp.net-core odata swagger