And*_*cht 5 odata swagger asp.net-core
我有一个 .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; }
Run Code Online (Sandbox Code Playgroud)
B 和 C 都直接引用 A,如下所示:
public A A{ get; set; }
Run Code Online (Sandbox Code Playgroud)
这些都是非常标准的关系数据库模型内容,但 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 就会正常加载。
如果有人能对此有所启发,我将非常感激。预先感谢您提供的任何帮助。
经过两天的深入研究和实验,我无法找到任何开箱即用的解决方案。Swashbuckle 曾经是我的首选,但因为我在 .NetCore 中使用 Odata,所以这不是一个选择。Swashbuckle 分别为 OData 和 .NetCore 提供选项,但不幸的是,当一起使用时则不然。
然而,我确实找到了一个解决方案,通过一些努力,我能够将其转换为适合我需要的东西。以下帖子构成了我最终解决方案的起点(顺便说一句,这仍然是一个正在进行的工作):/sf/answers/3624190321/
我的“CustomDocumentFilter”版本已在 GitHub 上发布:https://github.com/SAEONData/NCCRD/blob/swagger_odata_netcore/NCCRD_API/NCCRD.Services.DataV2/Database/Contexts/CustomDocumentFilter.cs
如前所述,这仍然是一项正在进行的工作,因此它将在接下来的几天内发生变化,但与原始版本一起,我希望这可以帮助处于相同情况的其他人。另请记住,此类是根据我的特定需求进行调整的,并不是为其他人提供“开箱即用”的解决方案。
| 归档时间: |
|
| 查看次数: |
7724 次 |
| 最近记录: |