2016-07-11 5 views
5

У меня есть следующий простой контроллер Web API:Почему мой ASP.NET Core Web API-контроллер не возвращает XML?

// GET: api/customers 
    [HttpGet] 
    public async Task<IActionResult> Get() 
     { 
     var customers = await uow.Users.GetAllAsync(); 
     var dto = customers.Select(p => new CustomerDto {Id = p.Id, Email = p.Email, UserName = p.UserName}); 
     return Ok(dto); // IEnumerable<CustomerDto> 
     } 

В Почтальон, я устанавливаю заголовок Accept для application/xml, но независимо от того, что я стараюсь, я не могу получить только данные JSON обратно.

Postman screen shot

Я где-то читал, что для того, чтобы получить XML, я должен добавить [DataContract] и [DataMember] атрибуты моей DTO, который теперь выглядит следующим образом:

[DataContract] 
public class CustomerDto 
    { 
    [DataMember] 
    public string Id { get; set; } 

    [Required] 
    [EmailAddress] 
    [Display(Name = "Email")] 
    [DataMember] 
    public string Email { get; set; } 

    [Required] 
    [Display(Name = "Login Name")] 
    [DataMember] 
    public string UserName { get; set; } 
    } 

Я был у него несколько часов, и я просто не понимаю, почему это не работает. Я пробовал:

  • Заставить метод действия синхронных и асинхронных
  • Возвращение данных непосредственно, и установки типа возвращаемого значения IEnumerable<CustomerDto>
  • Преобразование коллекции в массив вместо списка
  • Вернувшиеся a IActionResult
  • Возврат одного элемента вместо коллекции
  • Я проверял, что заголовок Accept отображается в запросе, исследуя его в d ebugger.
  • Множество «Googling with Bing» и чтение различных блогов
  • Создание нового проекта WebAPI из шаблона и просмотр, если там есть какое-то вдохновение (на самом деле).

    Я ожидаю, что это просто, но я не могу видеть его ...

+0

Не могли бы вы показать, что вы зарегистрировали свои форматирующие элементы Xml в Startup.cs? –

+0

Вы когда-нибудь настраивали форматировщики? –

+0

Конечно, это была проблема. В прошлый раз я использовал WebAPI, который был включен по умолчанию. Я забыл о новом облегченном подходе к оплате в ASP.Net 5! Тем не менее, методы расширения не были действительно очень открытыми.Я должен был знать, чтобы установить еще один пакет NuGet, а затем вставить вызов AddMvc(). –

ответ

10

Xml форматтеры являются частью отдельного пакета: Microsoft.AspNetCore.Mvc.Formatters.Xml

Добавьте выше пакет и обновить startup.cs как показано ниже:

services 
    .AddMvc() 
    .AddXmlDataContractSerializerFormatters(); 

ИЛИ

services 
    .AddMvc() 
    .AddXmlSerializerFormatters(); 
+0

Ahh ... Я подумал, может ли это быть чем-то вроде этого. Позор документации немного недоделан. Не был ли форматировщик XML включен по умолчанию в MVC5? –

+1

Да, это было в MVC5, но это очень сильно изменилось в ASP.NET. 5 –

+0

Я вижу, что вы отредактировали свой ответ, чтобы представить два фортатера в качестве альтернатив, а не для совместного использования. Это верно? Если да, каковы плюсы и минусы каждого форматирования? –

1

Для MVC 1.1 вам нужно добавить пакет Microsoft.AspNetCore.Mvc.Formatters.Xml и редактировать Startup.cs:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; }) 
     .AddXmlSerializerFormatters() 
     .AddXmlDataContractSeria‌​lizerFormatters(); 
} 

Теперь вы можете установить Accept Заголовок:

XML: application/xml

JSON : application/json

Смежные вопросы