2016-07-11 25 views
5

mam następujący prosty kontroler Web API:Dlaczego mój kontroler API ASP.Net Core Web API nie zwróci kodu 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> 
     } 

W Postman, mam ustawienie nagłówka Accept do application/xml, ale bez względu na to, co staram, mogę uzyskać dane JSON tylko do tyłu.

Postman screen shot

Czytałem gdzieś, że w celu uzyskania XML, muszę dodać [DataContract] i [DataMember] atrybuty do mojego DTO, który teraz wygląda tak:

[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; } 
    } 

Byłem na to kilka godzin teraz i po prostu nie widzę, dlaczego to nie działa. Próbowałem:

  • Making metoda akcja synchroniczna i asynchroniczna
  • Wracając dane bezpośrednio, oraz ustawienie typu powrotną do IEnumerable<CustomerDto>
  • Konwersja kolekcji do tablicy zamiast listy
  • Skrutacyjnej IActionResult
  • Zwrot pojedynczego przedmiotu zamiast kolekcji
  • Sprawdziłem, czy nagłówek Accept pojawia się w żądaniu, sprawdzając go w d ebugger.
  • Wiele "Googling z Bing" i czytanie różnych blogów
  • Tworzenie nowego projektu WebAPI z szablonu i sprawdzanie, czy jest tam jakaś inspiracja (naprawdę nie).

    Spodziewam się to proste, ale nie mogę go zobaczyć ...

+0

Czy możesz pokazać, że zarejestrowałeś swoje formaty Xml w Startup.cs? –

+0

Czy kiedykolwiek skonfigurowałeś formatery? –

+0

Oczywiście, że to był problem. Ostatnio używałam interfejsu WebAPI, który był domyślnie włączony. Zapomniałem o nowym, lekkim podejściu pay-as-you-go w ASP.Net 5! Metody rozszerzania również nie były tak naprawdę łatwe do wykrycia.Musiałem wiedzieć, aby zainstalować inny pakiet NuGet, a następnie kropkę w wywołaniu AddMvc(). –

Odpowiedz

10

XML formatujących są częścią osobnego pakietu: Microsoft.AspNetCore.Mvc.Formatters.Xml

Dodaj powyższy pakiet i zaktualizować startup.cs jak poniżej:

services 
    .AddMvc() 
    .AddXmlDataContractSerializerFormatters(); 

lub

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

Ahh ... Zastanawiałem się, czy to może być coś takiego. Szkoda, że ​​dokumentacja jest nieco niedokończona. Czy formant XML nie był domyślnie włączony w MVC5? –

+1

Tak, to było w MVC5, ale zostało to bardzo wcześnie zmienione w ASP.NET 5 –

+0

Widzę, że zredagowałeś swoją odpowiedź, by przedstawić dwa formatery jako alternatywy, zamiast używać ich razem. Czy to jest poprawne? Jeśli tak, jakie są plusy i minusy każdego formatera? –

1

Dla MVC 1.1 trzeba dodać Pakietu Microsoft.AspNetCore.Mvc.Formatters.Xml i edytować Startup.cs:

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

Teraz można ustawić Akceptuj Header:

XML: application/xml

JSON : application/json

Powiązane problemy