Обнаружен возможный цикл объекта, который не поддерживается - PullRequest
0 голосов
/ 09 января 2020

Я знаю, что здесь есть вопросы и ответы по этой конкретной проблеме, но моя проблема мало уникальна (наверное).

Вот мой класс модели:

public class RoleMaster
{
    [Key]
    [Required]
    public int Id { get; set; }

    [Required]
    [StringLength(20)]        
    public string Role { get; set; }
}

Вот мой контроллер:

public class RolesController : ControllerBase
{
    private readonly IRolesRepository _repo;


    public RolesController(IRolesRepository repo)
    {
        _repo = repo;
    }


    [HttpGet]
    public IActionResult Get()
    {
        var roles = _repo.GetRoles();
        return new JsonResult(roles);
    }
}

Мой репозиторий:

public interface IRolesRepository
{
    Task<IEnumerable<RoleMaster>> GetRoles();
}

, а вот метод GetRoles:

public async Task<IEnumerable<RoleMaster>> GetRoles()
    {
        try
        {
            var roles = await db.RoleMaster.AsNoTracking().ToListAsync();

            return roles;
        }
        catch (Exception)
        {
            throw;
        }
    }

, и это ошибка, которую я получаю :

Произошло необработанное исключение при обработке запроса. JsonException: обнаружен возможный цикл объекта, который не поддерживается. Это может быть связано с циклом или если глубина объекта превышает максимально допустимую глубину 32. System.Text. Json .ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (int maxDepth)

Из других вопросов Я обнаружил, что если у вас есть ссылки на другие таблицы, то может возникнуть такая ошибка, но в моем случае нет другой таблицы. Это первая таблица, которую я создал и просто пробовал метод get.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

_repo.GetRoles(); не использует await ключевое слово

это var roles = _repo.GetRoles();

должно быть

var roles = await _repo.GetRoles();

асинхронное микширование c и non asyn c,

ниже не проверено, но вы должны получить jist

  [HttpGet]
    public  async Task<IActionResult> Get()
    {
        var roles = **await** _repo.GetRoles();
        return new JsonResult(roles);
    }

Оригинальный ответ был:

FYI - мой оригинальный ответ было на самом деле правильно ... objectA было ... Task, так как это то, что возвращалось из _repo.GetRoles();

ваши объекты A имеют ссылки на objectB, который ссылается на objectsA.

это просто конец рекурсии l oop, практически никогда не заканчивающийся попыткой сериализации.

hense возможный цикл объекта

Также вы не включили код, где исключение возможно, выбрасывает JsonResult, поэтому не может видеть, какой сериализатор вы используете.

Кроме того, если вы используете newton Json, то поддержка сложных объектов еще более ограничена.

Дальше - только Q на основе комментариев в комментариях не асинхронная c версия, в качестве основного (контроллера) поток не является асинхронным, если вы не хотите его менять, как указано выше или для ясности

public List<RoleMaster> GetRoles()
{
    try
    {
        var roles =  db.RoleMaster.AsNoTracking().ToList();
        return roles;
    }
    catch (Exception)
    {
        throw;
    }
}

Обновление для получения дополнительных указаний

https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.1

0 голосов
/ 22 февраля 2020

У меня была такая же проблема.

Вот что решило мою проблему:

Помещение атрибута JsonIgnore в свойство ссылки (что вызвало бесконечную сериализацию)

...