OutputFormatter XmlDataContractSerializerOutputFormatter asp. net ядро ​​не достигает дочернего элемента дочернего элемента - PullRequest
0 голосов
/ 09 января 2020

My. Net Тестовый проект Core API содержит данные, которые должны быть возвращены в формате xml, поэтому я установил и настроил XmlDataContractSerializerOutputFormatter в классе Startup,

services.AddMvc(setupAction => 
            {
                setupAction.ReturnHttpNotAcceptable = true;
                setupAction.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()); 
            });

, и после установки Accept Заголовок в Postman к значению application / xml, данные возвращаются как xml, но это может быть достигнуто только для родителя и первого потомка, после этого результаты в стандартном формате JSON. Родитель с внуком

Родитель с первым ребенком

Код контроллера для авторов:

namespace Lib.Controllers
{
    [Route("api/authors/{authorId}/books")]
    public class BooksController : Controller
    {
        private ILibraryRepository _libraryRepository;

        public BooksController(ILibraryRepository libraryRepository)
        {
            _libraryRepository = libraryRepository;
        }

        [HttpGet()]
        public IActionResult GetBooksForAuthor(Guid authorId)
        {
            if (!_libraryRepository.AuthorExists(authorId))
            {
                return NotFound();
            }

            var booksForAuthorFromRepo = _libraryRepository.GetBooksForAuthor(authorId);

            var booksForAuthor = AutoMapper.Mapper.Map<IEnumerable<BookDto>>(booksForAuthorFromRepo);

            return Ok(booksForAuthor);
        }

        [HttpGet("{id}")]
        public IActionResult GetBookForAuthor(Guid authorId, Guid Id)
        {
            if (!_libraryRepository.AuthorExists(authorId))
            {
                return NotFound();
            }
            var bookForAuthorFromRepo = _libraryRepository.GetBookForAuthor(authorId, Id);
            if (bookForAuthorFromRepo == null)
            {
                return NotFound("The book does not exist");
            }
            var bookForAuthor = AutoMapper.Mapper.Map<BookDto>(bookForAuthorFromRepo);
            return new JsonResult(bookForAuthor);
        }
    }
}

Код контроллера для книг:

namespace Lib.Controllers
{
    [Route("api/authors/{authorId}/books")]
    public class BooksController : Controller
    {
        private ILibraryRepository _libraryRepository;

        public BooksController(ILibraryRepository libraryRepository)
        {
            _libraryRepository = libraryRepository;
        }

        [HttpGet()]
        public IActionResult GetBooksForAuthor(Guid authorId)
        {
            if (!_libraryRepository.AuthorExists(authorId))
            {
                return NotFound();
            }

            var booksForAuthorFromRepo = _libraryRepository.GetBooksForAuthor(authorId);

            var booksForAuthor = AutoMapper.Mapper.Map<IEnumerable<BookDto>>(booksForAuthorFromRepo);

            return Ok(booksForAuthor);
        }

        [HttpGet("{id}")]
        public IActionResult GetBookForAuthor(Guid authorId, Guid Id)
        {
            if (!_libraryRepository.AuthorExists(authorId))
            {
                return NotFound();
            }
            var bookForAuthorFromRepo = _libraryRepository.GetBookForAuthor(authorId, Id);
            if (bookForAuthorFromRepo == null)
            {
                return NotFound("The book does not exist");
            }
            var bookForAuthor = AutoMapper.Mapper.Map<BookDto>(bookForAuthorFromRepo);
            return new JsonResult(bookForAuthor);
        }
    }
}

1 Ответ

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

Изменение типа возвращаемого значения с JsonResult () на Ok () решило проблему. Благодаря @ PanagiotisKanavos

...