Swagger падает с круговыми ссылками на модели - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть .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: не удалось загрузить тип 'NCCRD.Services.DataV2.Database.Models.ProjectLocation' из сборки 'Tc2fc56a7babe40419a678a075439246c.DynamicModels, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = нуль 1029 * 10 * 10 *. *System.Signature.GetSignature (Void * pCorSig, int cCorSig, RuntimeFieldHandleInternal fieldHandle, метод IRuntimeMethodInfoHandle, 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/,, но это тоже не имело никакого эффекта.(Я тоже обращался к автору за помощью)

В тот момент, когда я удаляю ссылку на A из B или C, SwaggerUI прекрасно загружается.

Если кто-то может пролить свет на это, яЯ действительно ценю это.Заранее спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Похоже, что это ошибка, связанная с функцией Замена модели .Исправление было опубликовано в версии 3.1.1 пакета Microsoft.AspNetCore.OData.Versioning.ApiExplorer .Если проблема не устранена, сообщите о новой проблеме 1008 * в репозитории API Versioning.

0 голосов
/ 05 марта 2019

Я сериализовал ответ, используя linq.

Это мои классы:

public sealed class ProductDto
{
    public int ProductId { get; set; }
    public string Description { get; set; }
    public string Type { get; set; }

    public List<PlanDto> Plans { get; set; }
}

public class PlanDto
{
    public int PlanId { get; set; }
    public int ProductId { get; set; }
    public string Description { get; set; }
    public bool Active { get; set; }
    public DateTime Created { get; set; }

    public virtual ProductDto Product { get; set; }
}

Затем я удалил из ответа круговую ссылку, которая в этом случае Product = null .

Мое решение:

productEntity.ForEach(i => i.Plans.ForEach(j => j.Product = null));

Когда Swagger исправляет эту проблему, эта сериализация не требуется.

0 голосов
/ 12 декабря 2018

После двух дней интенсивных исследований и экспериментов я не смог найти никаких решений, которые бы работали «из коробки».Swashbuckle раньше был моей идеей для этого, но поскольку я использую Odata в .NetCore, это не вариант.Swashbuckle предлагает опции для OData и .NetCore по отдельности, но, к сожалению, не при их совместном использовании.

Однако я нашел решение, которое с некоторыми усилиями я смог преобразовать в то, что работает для моих нужд.Следующий пост сформировал отправную точку моего возможного решения (которое все еще находится в стадии разработки): https://stackoverflow.com/a/51774147/4261155

Моя версия "CustomDocumentFilter" установлена ​​на GitHub: https://github.com/SAEONData/NCCRD/blob/swagger_odata_netcore/NCCRD_API/NCCRD.Services.DataV2/Database/Contexts/CustomDocumentFilter.cs

Как уже упоминалось, это все еще в стадии разработки, поэтому она изменится в течение следующих нескольких дней, но вместе с оригинальной версией я надеюсь, что это может помочь кому-то еще в этой же ситуации.Также имейте в виду, что этот класс был адаптирован к моим конкретным потребностям и не предназначен как «готовое» решение для кого-либо еще.

...