NetCore3 API не возвращает / сериализует мои данные - PullRequest
1 голос
/ 26 февраля 2020

У меня есть следующий контроллер:

[HttpGet("idfull/{id}")]
        public async Task<IActionResult> GetAccountByIdFull(int id)
        {
            try
            {
                var response = await _accountFacade.GetAccountByIdAsync(id, full: true).ConfigureAwait(false);

                if (response == null)
                    return NoContent();

                return Ok(response);
            }
            catch (KeyNotFoundException kEx)
            {
                return NotFound();
            }
            catch (Exception ex)
            {
                return StatusCode((int)HttpStatusCode.InternalServerError);
            }
        }

Фасадный слой:

public async Task<AccountViewModel> GetAccountByIdAsync(int accountId, bool full = false)
        {
            try
            {
                var unmappedResponse = await _accountService.GetAccountByIdAsync(accountId, full);
                var mappedResponse = _mapper.Map<AccountViewModel>(unmappedResponse);

                return mappedResponse;
            }
            catch
            {
                throw;
            }
        }

Сервисный уровень:

public async Task<Account> GetAccountByIdAsync(int accountId, bool full = false)
    {
        try
        {
            Account account;
            if (full)
            {
                account = await _repo.GetOneAsync<Account>(x => x.AccountId == accountId);

                account.Company = await _repo.GetOneAsync<Company>(filter: x => x.CompanyId == account.CompanyId, 
                    includes: source => source
                    .Include(c => c.CompanyTransferType)
                        .ThenInclude(ctt => ctt.PartnerCompanyAccountType)
                    .Include(c => c.CompanyTransferType).ThenInclude(ctt => ctt.TransferType)
                    .Include(c => c.CompanyEquipment).ThenInclude(ce => ce.Equipment)
                    .Include(c => c.CompanyAccountGroup)
                    .Include(c => c.CompanyAccountType));

                account.AccountContact = await _repo.GetAsync<AccountContact>(filter: x => x.AccountId == accountId);

                account.AccountEquipment = await _repo.GetAsync<AccountEquipment>(filter: x => x.AccountId == accountId,
                    includes: source => source
                    .Include(ae => ae.AccountEquipmentFee).Include(ae => ae.CompanyEquipment).ThenInclude(ce => ce.Equipment));

                account.AccountPickVolumeDefaultAccount = await _repo.GetAsync<AccountPickVolumeDefault>(filter: x => x.AccountId == accountId,
                    includes: source => source
                    .Include(a => a.Equipment).Include(a => a.PartnerAccount));
            }
            else
            {
                 account = await _repo.GetByIdAsync<Account>(accountId);
            }

            if (account == null)
                throw new KeyNotFoundException($"Could not find Account with ID: {accountId}");

            return account;
        }
        catch
        {
            throw;
        }
    }       

Что я не понимаю, так это , контроллер возвращает OK статус и все мои поля заполнены. Однако API зависает и не возвращает мои данные, иными словами, API Swagger (включая интерфейсное приложение) не получает ответ и продолжает показывать кнопку загрузки.

У меня странное чувство он имеет отношение к Serialization, но не уверен, как это исправить.

Я обязательно выключил SelfRefenceLooping, как можно увидеть здесь:

services.AddControllers().AddNewtonsoftJson(setup =>
        {
            setup.SerializerSettings.ContractResolver = new DefaultContractResolver();
            setup.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

Почему API не возвращает объект JSON?

1 Ответ

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

Можете ли вы попробовать без .ConfigureAwait(false)?

Кроме этого, ваш код выглядит нормально и API должен работать нормально.

Если у вас его нет, я бы порекомендовал добавление Swagger к вашему API, это всего лишь 5-10 строк, и это очень помогает на этапе разработки (а также позволяет избежать ошибок вручную при тестировании). Вот официальная документация: ASP. NET Страницы справки основного веб-API с помощью Swagger / OpenAPI

Вы также можете попробовать добавить очень глупое действие в свой контроллер, чтобы попробовать определить, откуда возникла проблема (Уровень контроллера? Сервисный уровень? Фасадный уровень?)

...